public List reorderModules()

in plugins/org.apache.geronimo.st.v30.core/src/main/java/org/apache/geronimo/st/v30/core/internal/DependencyHelper.java [85:227]


    public List reorderModules(IServer server, List modules, List deltaKind) {
        Trace.tracePoint("Entry", Activator.traceInternal, "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 ", Activator.traceInternal, "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) {
                    Environment environment = getEnvironment(singleModule);
                    if (environment != null) {
                        Artifact child = environment.getModuleId();
                        Dependencies dependencies = environment.getDependencies();
                        if (dependencies != null) {
                            List<Dependency> depList = dependencies.getDependency();
                            for (Dependency dep : depList) {
                                Artifact parent = deploymentFactory.createArtifact();
                                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 {
                    Environment environment = getEnvironment(module[0]);
                    if (environment != null) {
                        Artifact 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 ", Activator.traceInternal, "DependencyHelper.reorderModules", reorderedLists);
        return reorderedLists;
    }