Author: lcorneliussen Date: Fri Apr 27 20:10:06 2012 New Revision: 1331567 URL: http://svn.apache.org/viewvc?rev=1331567&view=rev Log: [NPANDAY-556] Importer for Nuget Packages
o added support for redirecting references to other packages Modified: incubator/npanday/trunk/components/dotnet-model/dotnet-model-library-import/library-import.mdo incubator/npanday/trunk/components/dotnet-model/dotnet-model-library-import/src/test/groovy/AssemblyPluginXpp3ReaderTest.groovy incubator/npanday/trunk/components/dotnet-model/dotnet-model-library-import/src/test/resources/sample-nuget-imports.xml incubator/npanday/trunk/plugins/library-importer-maven-plugin/src/main/java/npanday/plugin/libraryimporter/generate/GeneratePackageArtifactsMojo.java incubator/npanday/trunk/plugins/library-importer-maven-plugin/src/main/java/npanday/plugin/libraryimporter/install/AbstractInstallMojo.java incubator/npanday/trunk/plugins/library-importer-maven-plugin/src/main/java/npanday/plugin/libraryimporter/model/NugetPackage.java incubator/npanday/trunk/plugins/library-importer-maven-plugin/src/main/java/npanday/plugin/libraryimporter/model/NugetPackageLibrary.java incubator/npanday/trunk/plugins/library-importer-maven-plugin/src/main/java/npanday/plugin/libraryimporter/skeletons/AbstractHandleEachLibraryMojo.java Modified: incubator/npanday/trunk/components/dotnet-model/dotnet-model-library-import/library-import.mdo URL: http://svn.apache.org/viewvc/incubator/npanday/trunk/components/dotnet-model/dotnet-model-library-import/library-import.mdo?rev=1331567&r1=1331566&r2=1331567&view=diff ============================================================================== --- incubator/npanday/trunk/components/dotnet-model/dotnet-model-library-import/library-import.mdo (original) +++ incubator/npanday/trunk/components/dotnet-model/dotnet-model-library-import/library-import.mdo Fri Apr 27 20:10:06 2012 @@ -135,8 +135,33 @@ </field> <!-- TODO: add 'namePattern' for regex matching --> + + <field xml.tagName="toPackage"> + <name>mapToPackage</name> + <association> + <type>ReferenceToPackageMapping</type> + <multiplicity>1</multiplicity> + </association> + </field> + <!-- TODO: allow for specify mapping to different artifact --> </fields> </class> + + <class> + <name>ReferenceToPackageMapping</name> + <fields> + <field xml.attribute="true"> + <name>id</name> + <type>String</type> + </field> + + <field xml.attribute="true"> + <name>version</name> + <type>String</type> + </field> + + </fields> + </class> </classes> </model> \ No newline at end of file Modified: incubator/npanday/trunk/components/dotnet-model/dotnet-model-library-import/src/test/groovy/AssemblyPluginXpp3ReaderTest.groovy URL: http://svn.apache.org/viewvc/incubator/npanday/trunk/components/dotnet-model/dotnet-model-library-import/src/test/groovy/AssemblyPluginXpp3ReaderTest.groovy?rev=1331567&r1=1331566&r2=1331567&view=diff ============================================================================== --- incubator/npanday/trunk/components/dotnet-model/dotnet-model-library-import/src/test/groovy/AssemblyPluginXpp3ReaderTest.groovy (original) +++ incubator/npanday/trunk/components/dotnet-model/dotnet-model-library-import/src/test/groovy/AssemblyPluginXpp3ReaderTest.groovy Fri Apr 27 20:10:06 2012 @@ -50,6 +50,11 @@ class AssemblyPluginXpp3ReaderTest assert model.nugetImports[0].referenceMappings[0].name == "AssemblyName" assert model.nugetImports[0].referenceMappings[0].ignore + assert model.nugetImports[0].referenceMappings[0].mapToPackage != null + assert model.nugetImports[0].referenceMappings[0].mapToPackage.id == "pname" + assert model.nugetImports[0].referenceMappings[0].mapToPackage.version == "1.0" + + assert model.nugetSources != null assert model.nugetSources.addNugetGallery assert model.nugetSources.customSources.size() == 1 Modified: incubator/npanday/trunk/components/dotnet-model/dotnet-model-library-import/src/test/resources/sample-nuget-imports.xml URL: http://svn.apache.org/viewvc/incubator/npanday/trunk/components/dotnet-model/dotnet-model-library-import/src/test/resources/sample-nuget-imports.xml?rev=1331567&r1=1331566&r2=1331567&view=diff ============================================================================== --- incubator/npanday/trunk/components/dotnet-model/dotnet-model-library-import/src/test/resources/sample-nuget-imports.xml (original) +++ incubator/npanday/trunk/components/dotnet-model/dotnet-model-library-import/src/test/resources/sample-nuget-imports.xml Fri Apr 27 20:10:06 2012 @@ -33,7 +33,9 @@ <mapReference name="AssemblyName" - ignore="true"/> + ignore="true"> + <toPackage id="pname" version="1.0" /> + </mapReference> </nuget> </libs> Modified: incubator/npanday/trunk/plugins/library-importer-maven-plugin/src/main/java/npanday/plugin/libraryimporter/generate/GeneratePackageArtifactsMojo.java URL: http://svn.apache.org/viewvc/incubator/npanday/trunk/plugins/library-importer-maven-plugin/src/main/java/npanday/plugin/libraryimporter/generate/GeneratePackageArtifactsMojo.java?rev=1331567&r1=1331566&r2=1331567&view=diff ============================================================================== --- incubator/npanday/trunk/plugins/library-importer-maven-plugin/src/main/java/npanday/plugin/libraryimporter/generate/GeneratePackageArtifactsMojo.java (original) +++ incubator/npanday/trunk/plugins/library-importer-maven-plugin/src/main/java/npanday/plugin/libraryimporter/generate/GeneratePackageArtifactsMojo.java Fri Apr 27 20:10:06 2012 @@ -74,7 +74,7 @@ public class GeneratePackageArtifactsMoj for ( NugetPackage nuget : nugetImports ) { - for ( NugetPackageLibrary lib : nuget.getLibraries(mavenProjectsCacheDirectory) ) + for ( NugetPackageLibrary lib : nuget.getLibraries(getLog(), mavenProjectsCacheDirectory) ) { imports.add( lib ); } Modified: incubator/npanday/trunk/plugins/library-importer-maven-plugin/src/main/java/npanday/plugin/libraryimporter/install/AbstractInstallMojo.java URL: http://svn.apache.org/viewvc/incubator/npanday/trunk/plugins/library-importer-maven-plugin/src/main/java/npanday/plugin/libraryimporter/install/AbstractInstallMojo.java?rev=1331567&r1=1331566&r2=1331567&view=diff ============================================================================== --- incubator/npanday/trunk/plugins/library-importer-maven-plugin/src/main/java/npanday/plugin/libraryimporter/install/AbstractInstallMojo.java (original) +++ incubator/npanday/trunk/plugins/library-importer-maven-plugin/src/main/java/npanday/plugin/libraryimporter/install/AbstractInstallMojo.java Fri Apr 27 20:10:06 2012 @@ -229,7 +229,7 @@ public abstract class AbstractInstallMoj { String localRepoUrl = new File( localRepository ).toURI().toString(); - getLog().info( "NPANDAY-146-002: Using alternate local repository " + localRepository ); + getLog().debug( "NPANDAY-146-002: Using alternate local repository " + localRepository ); localArtifactRepository = artifactRepositoryFactory.createArtifactRepository( "library-importer-local", localRepoUrl, layout, null, null Modified: incubator/npanday/trunk/plugins/library-importer-maven-plugin/src/main/java/npanday/plugin/libraryimporter/model/NugetPackage.java URL: http://svn.apache.org/viewvc/incubator/npanday/trunk/plugins/library-importer-maven-plugin/src/main/java/npanday/plugin/libraryimporter/model/NugetPackage.java?rev=1331567&r1=1331566&r2=1331567&view=diff ============================================================================== --- incubator/npanday/trunk/plugins/library-importer-maven-plugin/src/main/java/npanday/plugin/libraryimporter/model/NugetPackage.java (original) +++ incubator/npanday/trunk/plugins/library-importer-maven-plugin/src/main/java/npanday/plugin/libraryimporter/model/NugetPackage.java Fri Apr 27 20:10:06 2012 @@ -30,12 +30,14 @@ import npanday.model.library.imports.Nug import npanday.model.library.imports.NugetSources; import npanday.model.library.imports.ReferenceMapping; import npanday.nuget.NugetSemanticVersion; +import npanday.nuget.NugetVersionSpec; import npanday.plugin.libraryimporter.AssemblyInfo; import npanday.plugin.libraryimporter.LibImporterPathUtils; import npanday.plugin.libraryimporter.NuspecDependency; import npanday.plugin.libraryimporter.NuspecMetadata; import npanday.plugin.libraryimporter.NuspecParser; import org.apache.maven.plugin.MojoExecutionException; +import org.apache.maven.plugin.logging.Log; import java.io.File; import java.util.Collection; @@ -51,6 +53,8 @@ public class NugetPackage private List<NugetPackage> dependencies; + private Collection<NugetPackage> knownPackages; + public static List<NugetPackage> Convert( Iterable<NugetImport> imports, NugetSources nugetSources, File packageRootDirectory ) { @@ -109,16 +113,35 @@ public class NugetPackage return new File( packageRootDirectory, getName() + "." + getVersion() ); } - public Iterable<NugetPackageLibrary> getLibraries(File mavenProjectsCacheDirectory) throws MojoExecutionException + public Iterable<NugetPackageLibrary> getLibraries( Log log, File mavenProjectsCacheDirectory ) throws + MojoExecutionException { List<File> libDirectories = getLibraryDirectories(); List<NugetPackageLibrary> libImports = Lists.newArrayList(); for ( File libDir : libDirectories ) { - for ( File lib : LibImporterPathUtils.getLibraries( libDir ) ) + for ( File libFile : LibImporterPathUtils.getLibraries( libDir ) ) { - libImports.add( new NugetPackageLibrary( this, lib, mavenProjectsCacheDirectory ) ); + NugetPackageLibrary lib = new NugetPackageLibrary( this, libFile, mavenProjectsCacheDirectory ); + + ReferenceMapping referenceMapping = tryFindReferenceMappingFor( lib.getAssemblyInfo() ); + if ( referenceMapping != null && referenceMapping.getMapToPackage() != null ) + { + if ( log.isDebugEnabled() ) + { + log.debug( + "NPANDAY-142-004: Will skip inclusion for " + lib + + " since references to it are mapped to a different package (" + + referenceMapping.getMapToPackage().getId() + ", v" + + referenceMapping.getMapToPackage().getVersion() + ")." + ); + } + + continue; + } + + libImports.add( lib ); } } return libImports; @@ -200,43 +223,52 @@ public class NugetPackage { Preconditions.checkArgument( dependencies == null, "Dependencies have already been resolved" ); + knownPackages = packages; dependencies = Lists.newArrayList(); for ( Object depO : getNuspec().getDependencies() ) { // NOTE: stub-generator should IMHO generate List<NuspecDependency> NuspecDependency dep = (NuspecDependency) depO; + NugetPackage highest = resolveDependencyAmongAllKnown( dep ); - NugetPackage highest = null; - for ( NugetPackage pkg : packages ) - { - if ( !pkg.getName().equals( dep.getId() ) ) - { - continue; - } + dependencies.add( highest ); + } - if ( dep.getVersion() != null && !dep.getVersion().isSatisfiedBy( pkg.getVersion() ) ) - { - continue; - } + return dependencies; + } - if ( highest == null || highest.getVersion().compareTo( pkg.getVersion() ) < 0 ) - { - highest = pkg; - } + public NugetPackage resolveDependencyAmongAllKnown( NuspecDependency dep ) throws MojoExecutionException + { + NugetVersionSpec depVersion = dep.getVersion(); + String depId = dep.getId(); + NugetPackage highest = null; + for ( NugetPackage pkg : getKnownPackages() ) + { + if ( !pkg.getName().equals( depId ) ) + { + continue; } - if ( highest == null ) + if ( depVersion != null && !depVersion.isSatisfiedBy( pkg.getVersion() ) ) { - throw new MojoExecutionException( - "NPANDAY-142-004: Could not resolve dependency " + dep + " among the nuget imports." - ); + continue; + } + + if ( highest == null || highest.getVersion().compareTo( pkg.getVersion() ) < 0 ) + { + highest = pkg; } - dependencies.add( highest ); } - return dependencies; + if ( highest == null ) + { + throw new MojoExecutionException( + "NPANDAY-142-004: Could not resolve dependency " + dep + " among the nuget imports." + ); + } + return highest; } public Collection<NugetPackage> getDependencies() @@ -279,7 +311,8 @@ public class NugetPackage sources.addAll( nugetSources.getCustomSources() ); - if (nugetSources.isAddNugetGallery()){ + if ( nugetSources.isAddNugetGallery() ) + { sources.add( "https://go.microsoft.com/fwlink/?LinkID=206669" ); } @@ -288,4 +321,13 @@ public class NugetPackage return null; } + + public Collection<NugetPackage> getKnownPackages() + { + Preconditions.checkNotNull( + dependencies, "Dependencies have not been resolved yet, there fore known packages are not available either" + ); + + return knownPackages; + } } Modified: incubator/npanday/trunk/plugins/library-importer-maven-plugin/src/main/java/npanday/plugin/libraryimporter/model/NugetPackageLibrary.java URL: http://svn.apache.org/viewvc/incubator/npanday/trunk/plugins/library-importer-maven-plugin/src/main/java/npanday/plugin/libraryimporter/model/NugetPackageLibrary.java?rev=1331567&r1=1331566&r2=1331567&view=diff ============================================================================== --- incubator/npanday/trunk/plugins/library-importer-maven-plugin/src/main/java/npanday/plugin/libraryimporter/model/NugetPackageLibrary.java (original) +++ incubator/npanday/trunk/plugins/library-importer-maven-plugin/src/main/java/npanday/plugin/libraryimporter/model/NugetPackageLibrary.java Fri Apr 27 20:10:06 2012 @@ -23,9 +23,12 @@ import com.google.common.base.Preconditi import com.google.common.base.Strings; import com.google.common.collect.Lists; import npanday.model.library.imports.ReferenceMapping; +import npanday.model.library.imports.ReferenceToPackageMapping; +import npanday.nuget.NugetVersionSpec; import npanday.plugin.libraryimporter.AssemblyInfo; import npanday.plugin.libraryimporter.LibImporterPathUtils; import npanday.plugin.libraryimporter.ManifestInfoParser; +import npanday.plugin.libraryimporter.NuspecDependency; import org.apache.maven.artifact.Artifact; import org.apache.maven.artifact.repository.ArtifactRepository; import org.apache.maven.model.Model; @@ -56,6 +59,8 @@ public class NugetPackageLibrary private List<NugetPackageLibrary> dependencies; + private List<NugetPackageLibrary> known; + public NugetPackageLibrary( NugetPackage nuget, File lib, File mavenProjectsCacheDirectory ) { this.nuget = nuget; @@ -124,6 +129,7 @@ public class NugetPackageLibrary { Iterable<AssemblyInfo> references = getAssemblyInfo().getReferences(); + known = imports; dependencies = Lists.newArrayList(); for ( final AssemblyInfo ref : references ) @@ -137,20 +143,31 @@ public class NugetPackageLibrary List<NugetPackageLibrary> matchingStrongNameAndPackage = Lists.newArrayList(); List<NugetPackageLibrary> matchingName = Lists.newArrayList(); List<NugetPackageLibrary> matchingNameAndPackage = Lists.newArrayList(); + String exactPackageScope = ""; + for ( NugetPackageLibrary lib : imports ) { - boolean inScope = nuget.isDependentOn( lib.getNugetPackage() ) || nuget == lib.getNugetPackage(); - - if ( lib.getAssemblyInfo().getStrongName().equals( ref.getStrongName() ) ) + if ( lib.name.equals( ref.getName() ) ) { - matchingStrongName.add( lib ); - if ( inScope ) + NugetPackage targetPackage = tryGetToPackageMapping( lib.getAssemblyInfo() ); + if (targetPackage != null){ + exactPackageScope = targetPackage.toString() + "/"; + } + + boolean inScope = + targetPackage != null + ? lib.getNugetPackage() == targetPackage + : nuget.isDependentOn( lib.getNugetPackage() ) || nuget == lib.getNugetPackage(); + + if ( lib.getAssemblyInfo().getStrongName().equals( ref.getStrongName() ) ) { - matchingStrongNameAndPackage.add( lib ); + matchingStrongName.add( lib ); + if ( inScope ) + { + matchingStrongNameAndPackage.add( lib ); + } } - } - if ( lib.name.equals( ref.getName() ) ) - { + matchingName.add( lib ); if ( inScope ) { @@ -164,25 +181,25 @@ public class NugetPackageLibrary String help = ""; if ( matchingNameAndPackage.size() > 0 ) { - help = ", but found matches by name and package: " + matchingName; + help += System.getProperty("line.separator") + " - but found matches by name and package: " + matchingName; } if ( matchingStrongName.size() > 0 ) { - help = ", but found exact matches in different package(s): " + matchingStrongName; + help += System.getProperty("line.separator") + " - but found exact matches in different package(s): " + matchingStrongName; } if ( matchingName.size() > 0 ) { - help = ", but found matches by name only: " + matchingName; + help += System.getProperty("line.separator") + " - but found matches by name only: " + matchingName; } if ( !Strings.isNullOrEmpty( help ) ) { - help += ". Please use the config to tweak reference resolving."; + help += System.getProperty("line.separator") + "Please use the config to tweak reference resolving."; } throw new MojoExecutionException( - "NPANDAY-145-002: Could not find exact match for reference from " + nuget.getName() + " / " + name - + " to '" + ref.getStrongName() + "'" + help + "NPANDAY-145-002: Could not find exact match for reference from " + nuget.getName() + "/" + name + + " to " + exactPackageScope + "[" + ref.getStrongName() + "]" + help ); } @@ -201,6 +218,23 @@ public class NugetPackageLibrary return dependencies; } + private NugetPackage tryGetToPackageMapping(AssemblyInfo ref) throws MojoExecutionException + { + ReferenceMapping referenceMapping = nuget.tryFindReferenceMappingFor( ref ); + if (referenceMapping != null && referenceMapping.getMapToPackage() != null) + { + NuspecDependency dep = new NuspecDependency(); + ReferenceToPackageMapping mapToPackage = referenceMapping.getMapToPackage(); + dep.setId( mapToPackage.getId() ); + + // TODO: support real version ranges here? + dep.setVersion( NugetVersionSpec.parse( "[" + mapToPackage.getVersion() + "]" ) ); + return nuget.resolveDependencyAmongAllKnown( dep ); + } + + return null; + } + private boolean isExcluded( AssemblyInfo ref ) { if ( ref.getStrongName().endsWith( /* .NET 2.0 BCL, mscorlib, ... */ "b77a5c561934e089" ) ) Modified: incubator/npanday/trunk/plugins/library-importer-maven-plugin/src/main/java/npanday/plugin/libraryimporter/skeletons/AbstractHandleEachLibraryMojo.java URL: http://svn.apache.org/viewvc/incubator/npanday/trunk/plugins/library-importer-maven-plugin/src/main/java/npanday/plugin/libraryimporter/skeletons/AbstractHandleEachLibraryMojo.java?rev=1331567&r1=1331566&r2=1331567&view=diff ============================================================================== --- incubator/npanday/trunk/plugins/library-importer-maven-plugin/src/main/java/npanday/plugin/libraryimporter/skeletons/AbstractHandleEachLibraryMojo.java (original) +++ incubator/npanday/trunk/plugins/library-importer-maven-plugin/src/main/java/npanday/plugin/libraryimporter/skeletons/AbstractHandleEachLibraryMojo.java Fri Apr 27 20:10:06 2012 @@ -38,7 +38,7 @@ public abstract class AbstractHandleEach for ( NugetPackage nuget : getNugetImports() ) { - for ( NugetPackageLibrary lib : nuget.getLibraries( mavenProjectsCacheDirectory ) ) + for ( NugetPackageLibrary lib : nuget.getLibraries( getLog(), mavenProjectsCacheDirectory ) ) { handleLibrary( lib );