public List reorderJAXBElements()

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


    public List<JAXBElement> reorderJAXBElements(List<JAXBElement> jaxbElements) {
        Trace.tracePoint("Entry", Activator.traceInternal, "DependencyHelper.reorderModules", jaxbElements);

        if (jaxbElements.size() == 0) {
            Trace.tracePoint("Exit ", Activator.traceInternal, "DependencyHelper.reorderModules", jaxbElements);
            return jaxbElements;
        }

        inputJAXBElements = jaxbElements;

        //
        // Iterate through all the JAXBElements and register the dependencies
        //
        for (JAXBElement jaxbElement : jaxbElements) {
            Environment environment = getEnvironment(jaxbElement);
            if (environment != null) {
                Artifact child = environment.getModuleId();
                if (child != null) {
                    Dependencies dependencies = environment.getDependencies();
                    if (dependencies != null) {
                        List<Dependency> depList = dependencies.getDependency();
                        if (depList != null) {
                            for (Dependency dep : depList) {
                                Artifact parent = deploymentFactory.createArtifact();
                                parent.setGroupId(dep.getGroupId());
                                parent.setArtifactId(dep.getArtifactId());
                                parent.setVersion(dep.getVersion());
                                parent.setType(dep.getType());
                                dm.addDependency(child, parent);
                            }
                        }
                    }
                }
            }
        }

        //
        // Iterate through all the JAXBElements again and reorder as necessary
        //
        for (JAXBElement jaxbElement : jaxbElements) {
            if (!reorderedJAXBElements.contains(jaxbElement)) {
                // Not already moved
                Environment environment = getEnvironment(jaxbElement);
                if (environment != null) {
                    Artifact artifact = environment.getModuleId();
                    if (artifact == null) {
                        // Move if null (nothing can be done)
                        if (!reorderedJAXBElements.contains(jaxbElement)) {
                            reorderedJAXBElements.add(jaxbElement);
                        }
                    } else if (dm.getParents(artifact).contains(artifact)
                            || dm.getChildren(artifact).contains(artifact)) {
                        // Move if a tight circular dependency (nothing can be done)
                        if (!reorderedJAXBElements.contains(jaxbElement)) {
                            reorderedJAXBElements.add(jaxbElement);
                        }
                    } else if (dm.getParents(artifact).size() == 0) {
                        // Move if no parents (nothing to do)
                        if (!reorderedJAXBElements.contains(jaxbElement)) {
                            reorderedJAXBElements.add(jaxbElement);
                        }
                    } else if (dm.getParents(artifact).size() > 0) {
                        // Move parents first
                        processJaxbParents(dm.getParents(artifact), artifact);
                        // Move self
                        if (!reorderedJAXBElements.contains(jaxbElement)) {
                            reorderedJAXBElements.add(jaxbElement);
                        }
                    }
                }
            }
        }

        //
        // Ensure return list is exactly the same size as the input list
        //
        assert reorderedJAXBElements.size() == jaxbElements.size();

        //
        // Return List of JAXBElements
        //
        Trace.tracePoint("Exit ", Activator.traceInternal, "DependencyHelper.reorderModules", reorderedJAXBElements);
        return reorderedJAXBElements;
    }