private void parseIvyDescriptorFiles( BuildListener listener, PrintStream logger, EnvVars envVars) throws IOException, InterruptedException { logger.println("Parsing Ivy Descriptor Files"); List<IvyModuleInfo> ivyDescriptors; try { IvyXmlParser parser = new IvyXmlParser(listener, project, settings, getModuleRoot().getRemote()); if (getModuleRoot().getChannel() instanceof Channel) ((Channel) getModuleRoot().getChannel()).preloadJar(parser, Ivy.class); ivyDescriptors = getModuleRoot().act(parser); } catch (IOException e) { if (e.getCause() instanceof AbortException) throw (AbortException) e.getCause(); throw e; } catch (Throwable e) { throw new IOException("Unable to parse ivy descriptors", e); } // update the module list Map<ModuleName, IvyModule> modules = project.modules; synchronized (modules) { Map<ModuleName, IvyModule> old = new HashMap<ModuleName, IvyModule>(modules); List<IvyModule> sortedModules = new ArrayList<IvyModule>(); modules.clear(); for (IvyModuleInfo ivyDescriptor : ivyDescriptors) { IvyModule mm = old.get(ivyDescriptor.name); if (mm != null) { // found an existing matching module if (debug) logger.println("Reconfiguring " + mm); mm.reconfigure(ivyDescriptor); modules.put(ivyDescriptor.name, mm); } else { // this looks like a new module logger.println( Messages.IvyModuleSetBuild_DiscoveredModule( ivyDescriptor.name, ivyDescriptor.displayName)); mm = new IvyModule(project, ivyDescriptor, getNumber()); modules.put(mm.getModuleName(), mm); } sortedModules.add(mm); mm.save(); } // at this point the list contains all the live modules project.sortedActiveModules = sortedModules; // remaining modules are no longer active. old.keySet().removeAll(modules.keySet()); for (IvyModule om : old.values()) { if (debug) logger.println("Disabling " + om); om.makeDisabled(true); } modules.putAll(old); } // we might have added new modules Hudson.getInstance().rebuildDependencyGraph(); // module builds must start with this build's number for (IvyModule m : modules.values()) m.updateNextBuildNumber(getNumber()); }