Author: brett
Date: Mon Mar  4 13:54:09 2013
New Revision: 1452306

URL: http://svn.apache.org/r1452306
Log:
[NPANDAY-578] correct resolution logic

MSBuild has a second target that will override other paths, which is how the 
reference assemblies are found. 
Included that in the process, and corrected some logic to ensure all the 
relevant versions are consulted.

Modified:
    
incubator/npanday/trunk/dotnet/assemblies/NPanday.ProjectImporter/Engine/notes.md
    
incubator/npanday/trunk/dotnet/assemblies/NPanday.ProjectImporter/Engine/src/main/csharp/Converter/Algorithms/AbstractPomConverter.cs

Modified: 
incubator/npanday/trunk/dotnet/assemblies/NPanday.ProjectImporter/Engine/notes.md
URL: 
http://svn.apache.org/viewvc/incubator/npanday/trunk/dotnet/assemblies/NPanday.ProjectImporter/Engine/notes.md?rev=1452306&r1=1452305&r2=1452306&view=diff
==============================================================================
--- 
incubator/npanday/trunk/dotnet/assemblies/NPanday.ProjectImporter/Engine/notes.md
 (original)
+++ 
incubator/npanday/trunk/dotnet/assemblies/NPanday.ProjectImporter/Engine/notes.md
 Mon Mar  4 13:54:09 2013
@@ -200,15 +200,9 @@ certain characteristics.
 The reference resolution now mostly matches that of MSBuild, after first
 checking the local Maven repository.
 
-This may still yield different results to Visual Studio, which looks
-primarily at Reference Assemblies at design time. If we moved to .Net 4.0 we
-would be able to more easily use the Microsoft.Build.Utilities to lookup both
-the framework libraries (Which currently use reflection), and the reference
-assemblies (through a similar method in ToolLocationHelper).
-
-In either case, these lookups should just be done to validate the artifact
-exists somewhere. They should not be put into the POM in either case as that
-reduced portability.
+These lookups should just be done to validate the artifact exists somewhere.
+They should not be put into the POM in either case as that reduced
+portability.
 
 Ideally, such dependencies could be marked as `provided` instead, and
 NPanday's own resolution should be able to lookup the correct framework

Modified: 
incubator/npanday/trunk/dotnet/assemblies/NPanday.ProjectImporter/Engine/src/main/csharp/Converter/Algorithms/AbstractPomConverter.cs
URL: 
http://svn.apache.org/viewvc/incubator/npanday/trunk/dotnet/assemblies/NPanday.ProjectImporter/Engine/src/main/csharp/Converter/Algorithms/AbstractPomConverter.cs?rev=1452306&r1=1452305&r2=1452306&view=diff
==============================================================================
--- 
incubator/npanday/trunk/dotnet/assemblies/NPanday.ProjectImporter/Engine/src/main/csharp/Converter/Algorithms/AbstractPomConverter.cs
 (original)
+++ 
incubator/npanday/trunk/dotnet/assemblies/NPanday.ProjectImporter/Engine/src/main/csharp/Converter/Algorithms/AbstractPomConverter.cs
 Mon Mar  4 13:54:09 2013
@@ -753,7 +753,7 @@ namespace NPanday.ProjectImporter.Conver
             // (1) Files from current project - indicated by 
{CandidateAssemblyFiles}
             // (2) $(ReferencePath) - the reference path property, which comes 
from the .USER file.
             // (3) The hintpath from the referenced item itself, indicated by 
{HintPathFromItem}.
-            // (4) The directory of MSBuild's "target" runtime from 
GetFrameworkPath.
+            // (4) The directory of MSBuild's "target" runtime from 
GetReferenceAssemblyPaths (if applicable) and GetFrameworkPath (<= 3.5).
             //     The "target" runtime folder is the folder of the runtime 
that MSBuild is a part of.
             // (5) Registered assembly folders, indicated by {Registry:*,*,*}
             // (6) Legacy registered assembly folders, indicated by 
{AssemblyFolders}
@@ -779,11 +779,11 @@ namespace NPanday.ProjectImporter.Conver
 
             // resolve from target framework directories
             if (refDependency == null && 
projectDigest.DependencySearchConfig.SearchFramework)
-                refDependency = ResolveDependencyFromDirectories(reference, 
GetTargetFrameworkDirectories());
+                refDependency = ResolveDependencyFromDirectories(reference, 
GetTargetFrameworkDirectories(), "target framework");
 
             // resolve from registered assembly directories
             if (refDependency == null && 
projectDigest.DependencySearchConfig.SearchReferenceAssemblies)
-                refDependency = ResolveDependencyFromDirectories(reference, 
GetTargetFrameworkAssemblyFoldersEx());
+                refDependency = ResolveDependencyFromDirectories(reference, 
GetTargetFrameworkAssemblyFoldersEx(), "extra assembly folder");
 
             // resolve from GAC
             if (refDependency == null && 
projectDigest.DependencySearchConfig.SearchGac)
@@ -800,18 +800,25 @@ namespace NPanday.ProjectImporter.Conver
             Dictionary<string,string> directories = new 
Dictionary<string,string>();
 
             RegistryKey root = 
Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\" + 
projectDigest.TargetFrameworkIdentifier);
-            bool found = false;
-            foreach (string key in root.GetSubKeyNames())
+
+            if (projectDigest.TargetFrameworkVersion == "v4.0")
             {
-                if (key.StartsWith(projectDigest.TargetFrameworkVersion))
-                {
-                    RegistryKey assemblyFolderEx = root.OpenSubKey(key + 
"\\AssemblyFoldersEx");
-                    
GetTargetFrameworkDirectoriesAssemblyFoldersEx(directories, assemblyFolderEx);
-                    found = true;
-                }
+                GetTargetFrameworkDirectoriesAssemblyFoldersEx(directories, 
root.OpenSubKey("v4.0.30319\\AssemblyFoldersEx"));
+            }
+            if (projectDigest.TargetFrameworkVersion == "v3.5")
+            {
+                GetTargetFrameworkDirectoriesAssemblyFoldersEx(directories, 
root.OpenSubKey("v3.5\\AssemblyFoldersEx"));
+            }
+            if (projectDigest.TargetFrameworkVersion == "v3.5" || 
projectDigest.TargetFrameworkVersion == "v3.0")
+            {
+                GetTargetFrameworkDirectoriesAssemblyFoldersEx(directories, 
root.OpenSubKey("v3.0\\AssemblyFoldersEx"));
+            }
+            if (projectDigest.TargetFrameworkVersion == "v3.5" || 
projectDigest.TargetFrameworkVersion == "v3.0" || 
projectDigest.TargetFrameworkVersion == "v2.0")
+            {
+                GetTargetFrameworkDirectoriesAssemblyFoldersEx(directories, 
root.OpenSubKey("v2.0.50727\\AssemblyFoldersEx"));
             }
 
-            if (!found)
+            if (directories.Count == 0)
                 log.WarnFormat("No AssemblyFoldersEx registry key found for 
{0} {1}", projectDigest.TargetFrameworkIdentifier, 
projectDigest.TargetFrameworkVersion);
 
             return directories;
@@ -819,18 +826,21 @@ namespace NPanday.ProjectImporter.Conver
 
         protected static void 
GetTargetFrameworkDirectoriesAssemblyFoldersEx(Dictionary<string, string> 
targetFrameworkDirectories, RegistryKey assemblyFolderEx)
         {
-            foreach (string key in assemblyFolderEx.GetSubKeyNames())
+            if (assemblyFolderEx != null)
             {
-                string v = 
(string)assemblyFolderEx.OpenSubKey(key).GetValue(null);
-                if (v != null)
+                foreach (string key in assemblyFolderEx.GetSubKeyNames())
                 {
-                    // strip non-alphanumeric characters to make a property
-                    targetFrameworkDirectories.Add(new 
Regex("[^A-Za-z0-9]").Replace(key, ""), v);
+                    string v = 
(string)assemblyFolderEx.OpenSubKey(key).GetValue(null);
+                    if (v != null)
+                    {
+                        // strip non-alphanumeric characters to make a property
+                        targetFrameworkDirectories.Add(new 
Regex("[^A-Za-z0-9]").Replace(key, ""), v);
+                    }
                 }
             }
         }
 
-        private Dependency ResolveDependencyFromDirectories(Reference 
reference, Dictionary<string, string> directories)
+        private Dependency ResolveDependencyFromDirectories(Reference 
reference, Dictionary<string, string> directories, string label)
         {
             foreach (KeyValuePair<string, string> entry in directories)
             {
@@ -847,8 +857,8 @@ namespace NPanday.ProjectImporter.Conver
 
                     WarnNonPortableReference(path, refDependency);
 
-                    log.DebugFormat("Resolved {0} from target framework 
directories: {1}:{2}:{3}",
-                        reference.Name, refDependency.groupId, 
refDependency.artifactId, refDependency.version);
+                    log.DebugFormat("Resolved {0} from {1} directories: 
{2}:{3}:{4}",
+                        reference.Name, label, refDependency.groupId, 
refDependency.artifactId, refDependency.version);
                     return refDependency;
                 }
             }
@@ -895,33 +905,46 @@ namespace NPanday.ProjectImporter.Conver
             {
                 // TODO: add support for WinFX, which adds: $(CLR_REF_PATH) 
and $(WinFXAssemblyDirectory) (constructed by an MSBuild task)
                 // TODO: add support for CompactFramework, which overwrites 
with the output of the GetDeviceFrameworkPath MSBuild task
+                // TODO: may need to accommodate design-time facades which 
have special treatment in MSBuild
 
                 Dictionary<string, string> targetFrameworkDirectories = new 
Dictionary<string, string>();
 
                 if (projectDigest.TargetFrameworkVersion == "v4.0")
-                    AddTargetFrameworkDirectory(targetFrameworkDirectories, 
"GetPathToDotNetFramework", "Version40", "Framework40");
-                else if (projectDigest.TargetFrameworkVersion == "v3.5")
+                {
+                    // v4.0 overrides the path to just include the reference 
assemblies
+                    AddTargetFrameworkDirectory(targetFrameworkDirectories, 
"GetPathToDotNetFrameworkReferenceAssemblies", "Version40", "FrameworkRef40");
+                }
+                if (projectDigest.TargetFrameworkVersion == "v3.5")
+                {
+                    AddTargetFrameworkDirectory(targetFrameworkDirectories, 
"GetPathToDotNetFrameworkReferenceAssemblies", "Version35", "FrameworkRef35");
                     AddTargetFrameworkDirectory(targetFrameworkDirectories, 
"GetPathToDotNetFramework", "Version35", "Framework35");
-                else if (projectDigest.TargetFrameworkVersion == "v3.5" || 
projectDigest.TargetFrameworkVersion == "v3.0")
+                }
+                if (projectDigest.TargetFrameworkVersion == "v3.5" || 
projectDigest.TargetFrameworkVersion == "v3.0")
+                {
+                    AddTargetFrameworkDirectory(targetFrameworkDirectories, 
"GetPathToDotNetFrameworkReferenceAssemblies", "Version30", "FrameworkRef30");
                     AddTargetFrameworkDirectory(targetFrameworkDirectories, 
"GetPathToDotNetFramework", "Version30", "Framework30");
-                else if (projectDigest.TargetFrameworkVersion == "v3.5" || 
projectDigest.TargetFrameworkVersion == "v3.0" || 
projectDigest.TargetFrameworkVersion == "v2.0")
+                }
+                if (projectDigest.TargetFrameworkVersion == "v3.5" || 
projectDigest.TargetFrameworkVersion == "v3.0" || 
projectDigest.TargetFrameworkVersion == "v2.0")
+                {
                     AddTargetFrameworkDirectory(targetFrameworkDirectories, 
"GetPathToDotNetFramework", "Version20", "Framework20");
-                else if (projectDigest.TargetFrameworkVersion == "v1.1")
+                }
+                if (projectDigest.TargetFrameworkVersion == "v1.1")
+                {
                     AddTargetFrameworkDirectory(targetFrameworkDirectories, 
"GetPathToDotNetFramework", "Version11", "Framework11");
-                else
+                }
+
+                if (targetFrameworkDirectories.Count == 0)
+                {
                     log.WarnFormat("Unsupported framework version for 
determining target framework directories: {0}", 
projectDigest.TargetFrameworkVersion);
+                }
 
                 // Add SDK directory
                 if (projectDigest.TargetFrameworkVersion == "v4.0")
                     AddTargetFrameworkDirectory(targetFrameworkDirectories, 
"GetPathToDotNetFrameworkSdk", "Version40", "FrameworkSdk40");
                 else if (projectDigest.TargetFrameworkVersion == "v3.5")
                     AddTargetFrameworkDirectory(targetFrameworkDirectories, 
"GetPathToDotNetFrameworkSdk", "Version35", "FrameworkSdk35");
-                else if (projectDigest.TargetFrameworkVersion == "v3.0")
-                    AddTargetFrameworkDirectory(targetFrameworkDirectories, 
"GetPathToDotNetFrameworkSdk", "Version30", "FrameworkSdk30");
-                else if (projectDigest.TargetFrameworkVersion == "v2.0")
-                    AddTargetFrameworkDirectory(targetFrameworkDirectories, 
"GetPathToDotNetFrameworkSdk", "Version20", "FrameworkSdk20");
-                else if (projectDigest.TargetFrameworkVersion == "v1.1")
-                    AddTargetFrameworkDirectory(targetFrameworkDirectories, 
"GetPathToDotNetFrameworkSdk", "Version11", "FrameworkSdk11");
+                // Version30 is unsupported for this call
+                // no value for SDK 2.0
 
                 log.InfoFormat("Target framework directories: {0}", 
string.Join(",", new 
List<string>(targetFrameworkDirectories.Values).ToArray()));
                 TargetFrameworkDirectories = targetFrameworkDirectories;


Reply via email to