public List reorderModules()

in plugins/org.apache.geronimo.st.v11.core/src/main/java/org/apache/geronimo/st/v11/core/internal/DependencyHelper.java [82:232]


    public List reorderModules(IServer server, List modules, List deltaKind ) {
        Trace.tracePoint("Entry", "DependencyHelper.reorderModules", modules, deltaKind);
        
        //provide a cache
        ConcurrentHashMap<String,Boolean> verifiedModules = new ConcurrentHashMap<String,Boolean>();

        if (modules.size() == 0) {
            List reorderedLists = new ArrayList(2);
            reorderedLists.add(modules);
            reorderedLists.add(deltaKind);
            Trace.tracePoint("Exit ", "DependencyHelper.reorderModules", reorderedLists);
            return reorderedLists;
        }

        inputModules = modules;
        inputDeltaKind = deltaKind;

        // 
        // Iterate through all the modules and register the dependencies
        // 
        for (int ii=0; ii<modules.size(); ii++) {
            IModule[] module = (IModule[]) modules.get(ii);
            int moduleDeltaKind = ((Integer)deltaKind.get(ii)).intValue();
            if (moduleDeltaKind != ServerBehaviourDelegate.REMOVED) {
            	//GERONIMODEVTOOLS-361
            	for (IModule singleModule:module){
            		EnvironmentType environment = getEnvironment(singleModule);
	                if (environment != null) {
	                    ArtifactType child = environment.getModuleId();
	                    DependenciesType dependencies = environment.getDependencies();
	                    if (dependencies != null) {
	                        List<DependencyType> depList = dependencies.getDependency();
	                        for ( DependencyType dep : depList) {
	                            ArtifactType parent = deploymentFactory.createArtifactType();
	                            parent.setGroupId( dep.getGroupId() );
	                            parent.setArtifactId( dep.getArtifactId() );
	                            parent.setVersion( dep.getVersion() );
	                            parent.setType( dep.getType() );
	                            
	                            StringBuilder configId = new StringBuilder();
	                            if (dep.getGroupId()!=null)
	                            	configId.append(dep.getGroupId());
	                            configId.append("/");
	                            if (dep.getArtifactId()!=null)
	                            	configId.append(dep.getArtifactId());
	                            configId.append("/");
	                            if (dep.getVersion()!=null)
	                            	configId.append(dep.getVersion());
	                            configId.append("/");
	                            if (dep.getType()!=null)
	                            	configId.append(dep.getType());
	                            
	                            //get install flag from the cache
								Boolean isInstalledModule = verifiedModules
										.get(configId.toString());
								if (isInstalledModule == null) {
									// not in the cache, invoke
									// isInstalledModule() method
									isInstalledModule = DeploymentUtils
											.isInstalledModule(server,
													configId.toString());
									// put install flag into the cache for next
									// retrieve
									verifiedModules.put(configId.toString(),
											isInstalledModule);
								}

								if (!isInstalledModule)
                                    dm.addDependency( child, parent );
	                        }
	                    }
	                }
            	}
            }
        }

        // 
        // Iterate through all the modules again and reorder as necessary
        // 
        for (int ii=0; ii<modules.size(); ii++) {
            IModule[] module = (IModule[]) modules.get(ii);
            int moduleDeltaKind = ((Integer)deltaKind.get(ii)).intValue();
            if (module!=null && !reorderedModules.contains(module)) {
                // Not already moved 
                if (moduleDeltaKind == ServerBehaviourDelegate.REMOVED) {
                    // Move module if going to be removed 
                    reorderedModules.add(module);
                    reorderedKinds.add(moduleDeltaKind);
                }
                else {
                    EnvironmentType environment = getEnvironment(module[0]);
                    if (environment != null) {
                        ArtifactType artifact = environment.getModuleId();
                        if (artifact == null) {
                            // Move if null (nothing can be done)
                            if (!reorderedModules.contains(module)) {
                                reorderedModules.add(module);
                                reorderedKinds.add(moduleDeltaKind);
                            }
                        }
                        else if (dm.getParents(artifact).contains(artifact) ||  
                                 dm.getChildren(artifact).contains(artifact)) {
                            // Move if a tight circular dependency (nothing can be done)
                            if (!reorderedModules.contains(module)) {
                                reorderedModules.add(module);
                                reorderedKinds.add(moduleDeltaKind);
                            }
                        }
                        else if (dm.getParents(artifact).size() == 0) {
                            // Move if no parents (nothing to do)
                            if (!reorderedModules.contains(module)) {
                                reorderedModules.add(module);
                                reorderedKinds.add(moduleDeltaKind);
                            }
                        }
                        else if (dm.getParents(artifact).size() > 0) {
                            // Move parents first
                            processParents(dm.getParents(artifact), artifact);
                            // Move self 
                            if (!reorderedModules.contains(module)) {
                                reorderedModules.add(module);
                                reorderedKinds.add(moduleDeltaKind);
                            }
                        }
                    }else {
                    	//no environment defined, do just as no parents
                        if (!reorderedModules.contains(module)) {
                            reorderedModules.add(module);
                            reorderedKinds.add(moduleDeltaKind);
                        }
                    }
                }
            }
        }

        // 
        // Ensure return lists are exactly the same size as the input lists 
        // 
        assert reorderedModules.size() == modules.size();
        assert reorderedKinds.size() == deltaKind.size();

        // 
        // Return List of lists
        // 
        List reorderedLists = new ArrayList(2);
        reorderedLists.add(reorderedModules);
        reorderedLists.add(reorderedKinds);

        Trace.tracePoint("Exit ", "DependencyHelper.reorderModules", reorderedLists);
        return reorderedLists;
    }