From 9416ea6b6802678830d004f261bf15b96d1581dd Mon Sep 17 00:00:00 2001 From: Andrew Branson Date: Mon, 26 Nov 2012 15:05:17 +0100 Subject: Clean up module exception. Merge circular module dependency check with unmet check, earlier in the process. --- .../com/c2kernel/process/module/ModuleManager.java | 84 ++++++++++++---------- 1 file changed, 47 insertions(+), 37 deletions(-) (limited to 'src/main/java/com/c2kernel/process/module/ModuleManager.java') diff --git a/src/main/java/com/c2kernel/process/module/ModuleManager.java b/src/main/java/com/c2kernel/process/module/ModuleManager.java index 049558e..c495cbe 100644 --- a/src/main/java/com/c2kernel/process/module/ModuleManager.java +++ b/src/main/java/com/c2kernel/process/module/ModuleManager.java @@ -2,16 +2,12 @@ package com.c2kernel.process.module; import java.io.IOException; import java.net.URL; -import java.security.NoSuchAlgorithmException; import java.util.ArrayList; import java.util.Enumeration; import java.util.HashMap; import java.util.Properties; -import com.c2kernel.common.CannotManageException; import com.c2kernel.common.InvalidDataException; -import com.c2kernel.common.ObjectAlreadyExistsException; -import com.c2kernel.common.ObjectCannotBeUpdated; import com.c2kernel.common.ObjectNotFoundException; import com.c2kernel.entity.proxy.ItemProxy; import com.c2kernel.lookup.DomainPath; @@ -74,17 +70,40 @@ public class ModuleManager { } Logger.debug(5, "Checking dependencies"); - boolean depFailed = false; - for (Module thisMod : modules) { - ArrayList deps = thisMod.getDependencies(); - for (String dep : deps) { - if (!loadedModules.contains(dep)) { - Logger.error("UNMET MODULE DEPENDENCY: "+thisMod.getName()+" requires "+dep); - depFailed = true; + boolean allDepsPresent = false; + + ArrayList prevModules = new ArrayList(); + for (int i=0; i deps = thisMod.getDependencies(); + depClean = true; + for (String dep : deps) { + if (!loadedModules.contains(dep)) { + Logger.error("UNMET MODULE DEPENDENCY: "+thisMod.getName()+" requires "+dep); + allDepsPresent = true; + } + else if (!prevModules.contains(dep)) { + modules.remove(i); + modules.add(thisMod); + thisMod = modules.get(i); + skipped++; + depClean = false; + } + } + if (skipped > modules.size()-i) { + StringBuffer badMod = new StringBuffer(); + for (Module mod : modules.subList(i, modules.size())) { + badMod.append(mod.getName()).append(" "); + } + Logger.die("Circular module dependencies involving: "+badMod); } } + prevModules.add(thisMod.getName()); } - if (depFailed) Logger.die("Unmet module dependencies. Cannot continue"); + if (allDepsPresent) Logger.die("Unmet module dependencies. Cannot continue"); } public String getModuleVersions() { @@ -112,35 +131,26 @@ public class ModuleManager { } } - public void registerModules() throws ObjectNotFoundException, ObjectCannotBeUpdated, CannotManageException, ObjectAlreadyExistsException, NoSuchAlgorithmException { - ItemProxy serverEntity = (ItemProxy)Gateway.getProxyManager().getProxy(new DomainPath("/servers/"+Gateway.getProperty("ItemServer.name"))); + public void registerModules() throws ModuleException { + ItemProxy serverEntity; + try { + serverEntity = (ItemProxy)Gateway.getProxyManager().getProxy(new DomainPath("/servers/"+Gateway.getProperty("ItemServer.name"))); + } catch (ObjectNotFoundException e) { + throw new ModuleException("Cannot find local server name."); + } Logger.debug(3, "Registering modules"); - ArrayList importedModules = new ArrayList(); - for (int i=0; i deps = thisMod.getDependencies(); - depClean = true; - for (String dep : deps) { - if (!importedModules.contains(dep)) { - Logger.debug(3, "Modules "+thisMod.getName()+" depends on "+dep+" which hasn't been imported yet. Deferring."); - modules.remove(i); - modules.add(thisMod); - thisMod = modules.get(i); - skipped++; - depClean = false; - } - } - if (skipped > modules.size()-i) - throw new CannotManageException("Too many modules deferred. There might be circular dependencies", ""); - } + + for (Module thisMod : modules) { Logger.msg("Registering module "+thisMod.getName()); - thisMod.importAll(serverEntity, modulesXML.get(thisMod.ns)); + try { + thisMod.importAll(serverEntity, modulesXML.get(thisMod.ns)); + } catch (Exception e) { + Logger.error(e); + throw new ModuleException("Error importing Module items"); + } Logger.msg("Module "+thisMod.getName()+" registered"); - importedModules.add(thisMod.getName()); + } } -- cgit v1.2.3