All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.athaydes.osgiaas.grab.ivy.IvyModuleParser.groovy Maven / Gradle / Ivy

package com.athaydes.osgiaas.grab.ivy

import groovy.transform.Immutable
import groovy.util.slurpersupport.GPathResult

import javax.annotation.Nullable

class IvyModuleParser {

    List getDependenciesFrom( InputStream ivyModuleStream, InputStream mavenPom ) {
        def ivy = new XmlSlurper().parse( ivyModuleStream )
        def maven = new XmlSlurper().parse( mavenPom )
        extractDependencies ivy, maven
    }

    List getDependenciesFrom( File ivyModuleFile ) {
        def originalFile = new File( ivyModuleFile.parentFile, ivyModuleFile.name + '.original' )
        def parser = new XmlSlurper()

        def ivyXml = parser.parse( ivyModuleFile )
        def originalXml = null

        if ( originalFile.canRead() ) {
            originalXml = parser.parse( originalFile )
        }

        extractDependencies ivyXml, originalXml
    }

    private static List extractDependencies( GPathResult ivyXml,
                                                  @Nullable GPathResult originalXml ) {
        GPathResult dependencies = ivyXml.dependencies.dependency
        def ivyModules = ivyDependencies( dependencies )

        if ( originalXml ) {
            GPathResult originalDependencies = originalXml.dependencies.dependency
            return mavenDependencies( originalDependencies, ivyModules )
        } else {
            return ivyModules.values().collect {
                [ group: it.org, name: it.name, version: it.rev ]
            }
        }
    }

    private static Map ivyDependencies( GPathResult dependencies ) {
        dependencies.findAll {
            it.@org && it.@name && it.@rev
        }.collectEntries {
            [ ( moduleKey( [email protected](), [email protected]() ) ):
                      new IvyModule( [email protected](), [email protected](), [email protected]() ) ]
        }
    }

    private static List mavenDependencies( GPathResult dependencies,
                                                Map ivyModules ) {
        dependencies.findAll {
            it.groupId?.text() && it.artifactId?.text()
        }.collectMany {
            def scope = it.scope?.text() ?: 'compile'
            def optional = it.optional?.text() == 'true'

            // get the version from Ivy as Ivy resolves the best version
            def ivyModule = ivyModules[ moduleKey( it.groupId.text(), it.artifactId.text() ) ]

            if ( ivyModule && !optional && scope in [ 'compile', 'runtime' ] ) {
                [ [ group: it.groupId.text(), name: it.artifactId.text(), version: ivyModule.rev ] ]
            } else {
                [ ]
            }
        }
    }

    private static String moduleKey( org, name ) {
        "$org:$name"
    }

}

@Immutable
class IvyModule {
    String org
    String name
    String rev
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy