diff --git a/plexus-component-metadata/src/main/java/org/codehaus/plexus/metadata/DefaultMetadataGenerator.java b/plexus-component-metadata/src/main/java/org/codehaus/plexus/metadata/DefaultMetadataGenerator.java index c872e3ead..daf99f8e1 100644 --- a/plexus-component-metadata/src/main/java/org/codehaus/plexus/metadata/DefaultMetadataGenerator.java +++ b/plexus-component-metadata/src/main/java/org/codehaus/plexus/metadata/DefaultMetadataGenerator.java @@ -28,6 +28,7 @@ import java.util.ArrayList; import java.util.Collection; import java.util.Collections; +import java.util.Comparator; import java.util.List; import java.util.Map; @@ -101,6 +102,15 @@ public void generateDescriptor( MetadataGenerationRequest request ) } } + // Sort the descriptors by key to make the output reproducible + Collections.sort( descriptors, new Comparator() + { + public int compare( ComponentDescriptor d1, ComponentDescriptor d2 ) + { + return d1.getHumanReadableKey().compareTo( d2.getHumanReadableKey() ); + } + }); + List componentDescriptors = new ArrayList(); // diff --git a/plexus-component-metadata/src/test/java/org/codehaus/plexus/metadata/DefaultComponentDescriptorWriterTest.java b/plexus-component-metadata/src/test/java/org/codehaus/plexus/metadata/DefaultComponentDescriptorWriterTest.java index a3800aa68..8fdc743ee 100644 --- a/plexus-component-metadata/src/test/java/org/codehaus/plexus/metadata/DefaultComponentDescriptorWriterTest.java +++ b/plexus-component-metadata/src/test/java/org/codehaus/plexus/metadata/DefaultComponentDescriptorWriterTest.java @@ -16,7 +16,9 @@ package org.codehaus.plexus.metadata; +import java.io.File; import java.io.StringWriter; +import java.util.Collections; import java.util.List; import org.codehaus.plexus.PlexusTestCase; @@ -26,6 +28,12 @@ import org.codehaus.plexus.component.repository.ComponentDescriptor; import org.codehaus.plexus.component.repository.io.PlexusTools; import org.codehaus.plexus.configuration.PlexusConfiguration; +import org.codehaus.plexus.metadata.merge.ComponentsXmlMerger; +import org.codehaus.plexus.metadata.merge.Merger; +import org.codehaus.plexus.metadata.merge.PlexusXmlMerger; +import org.jdom2.Document; +import org.jdom2.Element; +import org.jdom2.input.SAXBuilder; /** * Test for the {@link DefaultComponentDescriptorWriter} class. @@ -96,4 +104,41 @@ public void testBasic() throws Exception { // TODO: Verify requirements and configuration too... but I'm too lazy for that right now // } + + public void testComponentsOrder() throws Exception { + MetadataGenerator generator = (MetadataGenerator) lookup(MetadataGenerator.class); + assertNotNull(generator); + + MetadataGenerationRequest request = new MetadataGenerationRequest(); + request.sourceDirectories = Collections.singletonList("src/main/java"); + request.classesDirectory = new File("target/classes"); + request.outputFile = new File("target/test-classes/components-sorted.xml"); + request.sourceEncoding = "UTF-8"; + request.useContextClassLoader = true; + + generator.generateDescriptor(request); + + assertTrue("Descriptor not generated", request.outputFile.exists()); + + Document doc = new SAXBuilder().build(request.outputFile); + + // check if the components are sorted by role+impl + List components = doc.getRootElement().getChild("components").getChildren(); + assertEquals("Number of components", 5, components.size()); + + assertEquals("Component 1 role", ComponentDescriptorExtractor.class.getName(), components.get(0).getChild("role").getText()); + assertEquals("Component 1 impl", ClassComponentDescriptorExtractor.class.getName(), components.get(0).getChild("implementation").getText()); + + assertEquals("Component 2 role", ComponentDescriptorExtractor.class.getName(), components.get(1).getChild("role").getText()); + assertEquals("Component 2 impl", SourceComponentDescriptorExtractor.class.getName(), components.get(1).getChild("implementation").getText()); + + assertEquals("Component 3 role", MetadataGenerator.class.getName(), components.get(2).getChild("role").getText()); + assertEquals("Component 3 impl", DefaultMetadataGenerator.class.getName(), components.get(2).getChild("implementation").getText()); + + assertEquals("Component 4 role", Merger.class.getName(), components.get(3).getChild("role").getText()); + assertEquals("Component 4 impl", ComponentsXmlMerger.class.getName(), components.get(3).getChild("implementation").getText()); + + assertEquals("Component 5 role", Merger.class.getName(), components.get(4).getChild("role").getText()); + assertEquals("Component 5 impl", PlexusXmlMerger.class.getName(), components.get(4).getChild("implementation").getText()); + } }