You are viewing a plain text version of this content. The canonical link for it is here.
Posted to npanday-commits@incubator.apache.org by br...@apache.org on 2011/06/28 04:57:53 UTC

svn commit: r1140436 - in /incubator/npanday/trunk/dotnet/assemblies: NPanday.ProjectImporter/Engine/src/main/csharp/NPanday/ProjectImporter/Converter/Algorithms/ NPanday.ProjectImporter/Engine/src/main/csharp/NPanday/ProjectImporter/Digest/Algorithms/...

Author: brett
Date: Tue Jun 28 04:57:53 2011
New Revision: 1140436

URL: http://svn.apache.org/viewvc?rev=1140436&view=rev
Log:
[NPDANY-445] refactor GAC utility to be more independent and reuse from reference addition logic as well to avoid parsing paths that may not be correct

Modified:
    incubator/npanday/trunk/dotnet/assemblies/NPanday.ProjectImporter/Engine/src/main/csharp/NPanday/ProjectImporter/Converter/Algorithms/AbstractPomConverter.cs
    incubator/npanday/trunk/dotnet/assemblies/NPanday.ProjectImporter/Engine/src/main/csharp/NPanday/ProjectImporter/Digest/Algorithms/NormalProjectDigestAlgorithm.cs
    incubator/npanday/trunk/dotnet/assemblies/NPanday.Utils/src/main/csharp/NPanday/Utils/GacUtility.cs
    incubator/npanday/trunk/dotnet/assemblies/NPanday.VisualStudio.Addin/src/main/csharp/NPanday/VisualStudio/Addin/Connect.cs

Modified: incubator/npanday/trunk/dotnet/assemblies/NPanday.ProjectImporter/Engine/src/main/csharp/NPanday/ProjectImporter/Converter/Algorithms/AbstractPomConverter.cs
URL: http://svn.apache.org/viewvc/incubator/npanday/trunk/dotnet/assemblies/NPanday.ProjectImporter/Engine/src/main/csharp/NPanday/ProjectImporter/Converter/Algorithms/AbstractPomConverter.cs?rev=1140436&r1=1140435&r2=1140436&view=diff
==============================================================================
--- incubator/npanday/trunk/dotnet/assemblies/NPanday.ProjectImporter/Engine/src/main/csharp/NPanday/ProjectImporter/Converter/Algorithms/AbstractPomConverter.cs (original)
+++ incubator/npanday/trunk/dotnet/assemblies/NPanday.ProjectImporter/Engine/src/main/csharp/NPanday/ProjectImporter/Converter/Algorithms/AbstractPomConverter.cs Tue Jun 28 04:57:53 2011
@@ -39,7 +39,6 @@ namespace NPanday.ProjectImporter.Conver
 {
     public abstract class AbstractPomConverter : IPomConverter
     {
-        protected GacUtility gacUtil;
         protected RspUtility rspUtil;
         protected ArtifactContext artifactContext;
         protected List<Artifact.Artifact> localArtifacts;
@@ -78,7 +77,6 @@ namespace NPanday.ProjectImporter.Conver
             this.version = parent != null ? parent.version : null;
 
             this.rspUtil = new RspUtility();
-            this.gacUtil = new GacUtility();
             this.model = new NPanday.Model.Pom.Model();
             
             // Add build Tag
@@ -749,7 +747,7 @@ namespace NPanday.ProjectImporter.Conver
                 return dependency;
             }
 
-            List<string> refs = gacUtil.GetAssemblyInfo(reference.Name, null, projectDigest.Platform);
+            List<string> refs = GacUtility.GetInstance().GetAssemblyInfo(reference.Name, null, projectDigest.Platform);
 
             // resolve from GAC
             if (refs.Count > 0)
@@ -757,65 +755,15 @@ namespace NPanday.ProjectImporter.Conver
                 // Assembly is found at the gac
 
                 //exclude ProcessArchitecture when loading assembly on a non-32 bit machine
-                refs = gacUtil.GetAssemblyInfo(reference.Name, reference.Version, null);
+                refs = GacUtility.GetInstance().GetAssemblyInfo(reference.Name, reference.Version, null);
 
                 System.Reflection.Assembly a = System.Reflection.Assembly.ReflectionOnlyLoad(new System.Reflection.AssemblyName(refs[0]).FullName);
  
                 Dependency refDependency = new Dependency();
                 refDependency.artifactId = reference.Name;
                 refDependency.groupId = reference.Name;
-                
-                if ("MSIL".Equals(reference.ProcessorArchitecture, StringComparison.OrdinalIgnoreCase))
-                {
-                    if (a.ImageRuntimeVersion.StartsWith("v4.0"))
-                    {
-                        refDependency.type = "gac_msil4";
-                    }
-                    else
-                    {
-                        refDependency.type = "gac_msil";
-                    }
-                }
-                else if ("x86".Equals(reference.ProcessorArchitecture, StringComparison.OrdinalIgnoreCase))
-                {
-                    if (a.ImageRuntimeVersion.StartsWith("v4.0"))
-                    {
-                        refDependency.type = "gac_32_4";
-                    }
-                    else
-                    {
-                        refDependency.type = "gac_32";
-                    }
-                }
-                else if ("IA64".Equals(reference.ProcessorArchitecture, StringComparison.OrdinalIgnoreCase) || 
-                     "AMD64".Equals(reference.ProcessorArchitecture, StringComparison.OrdinalIgnoreCase))
-                {
-                    if (a.ImageRuntimeVersion.StartsWith("v4.0"))
-                    {
-                        refDependency.type = "gac_64_4";
-                    }
-                    else
-                    {
-                        refDependency.type = "gac_64";
-                    }
-                }
 
-                //Assemblies that with null ProcessorArchitecture esp ASP.net assmblies (e.g MVC)
-                else if ((reference.ProcessorArchitecture == null) && ("31bf3856ad364e35".Equals(reference.PublicKeyToken.ToLower(), StringComparison.OrdinalIgnoreCase)))
-                {
-                    if (a.ImageRuntimeVersion.StartsWith("v4.0"))
-                    {
-                        refDependency.type = "gac_msil4";
-                    }
-                    else
-                    {
-                        refDependency.type = "gac_msil";
-                    }
-                }
-                else
-                {
-                    refDependency.type = "gac";
-                }
+                refDependency.type = GacUtility.GetNPandayGacType(a, reference.PublicKeyToken);
                 
                 refDependency.version = reference.Version ?? "1.0.0.0";
                 

Modified: incubator/npanday/trunk/dotnet/assemblies/NPanday.ProjectImporter/Engine/src/main/csharp/NPanday/ProjectImporter/Digest/Algorithms/NormalProjectDigestAlgorithm.cs
URL: http://svn.apache.org/viewvc/incubator/npanday/trunk/dotnet/assemblies/NPanday.ProjectImporter/Engine/src/main/csharp/NPanday/ProjectImporter/Digest/Algorithms/NormalProjectDigestAlgorithm.cs?rev=1140436&r1=1140435&r2=1140436&view=diff
==============================================================================
--- incubator/npanday/trunk/dotnet/assemblies/NPanday.ProjectImporter/Engine/src/main/csharp/NPanday/ProjectImporter/Digest/Algorithms/NormalProjectDigestAlgorithm.cs (original)
+++ incubator/npanday/trunk/dotnet/assemblies/NPanday.ProjectImporter/Engine/src/main/csharp/NPanday/ProjectImporter/Digest/Algorithms/NormalProjectDigestAlgorithm.cs Tue Jun 28 04:57:53 2011
@@ -167,7 +167,6 @@ namespace NPanday.ProjectImporter.Digest
         private static void DigestBuildItems(Project project, ProjectDigest projectDigest, string projectBasePath, ICollection<ProjectReference> projectReferences, ICollection<Reference> references, ICollection<Compile> compiles, ICollection<None> nones, ICollection<WebReferenceUrl> webReferenceUrls, ICollection<Content> contents, ICollection<Folder> folders, ICollection<WebReferences> webReferencesList, ICollection<EmbeddedResource> embeddedResources, ICollection<BootstrapperPackage> bootstrapperPackages, ICollection<string> globalNamespaceImports, IList<ComReference> comReferenceList)
         {
             string targetFramework = projectDigest.TargetFramework != null ? projectDigest.TargetFramework.Substring(0,3) : "2.0";
-            GacUtility gac = new GacUtility();
             RspUtility rsp = new RspUtility();
             foreach (BuildItemGroup buildItemGroup in project.ItemGroups)
             {
@@ -211,7 +210,7 @@ namespace NPanday.ProjectImporter.Digest
                                     else if (!rsp.IsRspIncluded(buildItem.Include,projectDigest.Language))
                                     {
                                         // simple name needs to be resolved
-                                        List<string> refs = gac.GetAssemblyInfo(buildItem.Include, null, null);
+                                        List<string> refs = GacUtility.GetInstance().GetAssemblyInfo(buildItem.Include, null, null);
                                         if (refs.Count == 0)
                                         {
                                             Console.WriteLine("Unable to find reference '" + buildItem.Include + "' in " + string.Join("; ", refs.ToArray()));

Modified: incubator/npanday/trunk/dotnet/assemblies/NPanday.Utils/src/main/csharp/NPanday/Utils/GacUtility.cs
URL: http://svn.apache.org/viewvc/incubator/npanday/trunk/dotnet/assemblies/NPanday.Utils/src/main/csharp/NPanday/Utils/GacUtility.cs?rev=1140436&r1=1140435&r2=1140436&view=diff
==============================================================================
--- incubator/npanday/trunk/dotnet/assemblies/NPanday.Utils/src/main/csharp/NPanday/Utils/GacUtility.cs (original)
+++ incubator/npanday/trunk/dotnet/assemblies/NPanday.Utils/src/main/csharp/NPanday/Utils/GacUtility.cs Tue Jun 28 04:57:53 2011
@@ -34,15 +34,18 @@ namespace NPanday.Utils
 {
     public class GacUtility
     {
-        private string gacs = "";
+        private string gacs;
 
-        public GacUtility()
+        private static GacUtility instance;
+
+        private GacUtility()
         {
             // Used to determine which references exist in the GAC, used during VS project import
             // TODO: we need a better way to determine this by querying the GAC using .NET
             //  rather than parsing command output
             //  consider this: http://www.codeproject.com/KB/dotnet/undocumentedfusion.aspx
             //  (works, but seems to be missing the processor architecture)
+            // Can also use LoadWithPartialName, but it is deprecated
             
             Process p = new Process();
 
@@ -70,6 +73,64 @@ namespace NPanday.Utils
             }
         }
 
+        public static GacUtility GetInstance()
+        {
+            if (instance == null)
+            {
+                instance = new GacUtility();
+            }
+            return instance;
+        }
+
+        public static string GetNPandayGacType(System.Reflection.Assembly a, string publicKeyToken)
+        {
+            ProcessorArchitecture architecture = a.GetName().ProcessorArchitecture;
+            return GetNPandayGacType(a.ImageRuntimeVersion, architecture, publicKeyToken);
+        }
+
+        public static string GetNPandayGacType(string runtimeVersion, ProcessorArchitecture architecture, string publicKeyToken)
+        {
+            string type;
+
+            if (architecture == ProcessorArchitecture.MSIL)
+            {
+                if (runtimeVersion.StartsWith("v4.0"))
+                {
+                    type = "gac_msil4";
+                }
+                else
+                {
+                    type = "gac_msil";
+                }
+            }
+            else if (architecture == ProcessorArchitecture.X86)
+            {
+                if (runtimeVersion.StartsWith("v4.0"))
+                {
+                    type = "gac_32_4";
+                }
+                else
+                {
+                    type = "gac_32";
+                }
+            }
+            else if (architecture == ProcessorArchitecture.IA64 || architecture == ProcessorArchitecture.Amd64)
+            {
+                if (runtimeVersion.StartsWith("v4.0"))
+                {
+                    type = "gac_64_4";
+                }
+                else
+                {
+                    type = "gac_64";
+                }
+            }
+            else
+            {
+                type = "gac";
+            }
+            return type;
+        }
 
         public List<string> GetAssemblyInfo(string assemblyName, string version, string processorArchitecture)
         {

Modified: incubator/npanday/trunk/dotnet/assemblies/NPanday.VisualStudio.Addin/src/main/csharp/NPanday/VisualStudio/Addin/Connect.cs
URL: http://svn.apache.org/viewvc/incubator/npanday/trunk/dotnet/assemblies/NPanday.VisualStudio.Addin/src/main/csharp/NPanday/VisualStudio/Addin/Connect.cs?rev=1140436&r1=1140435&r2=1140436&view=diff
==============================================================================
--- incubator/npanday/trunk/dotnet/assemblies/NPanday.VisualStudio.Addin/src/main/csharp/NPanday/VisualStudio/Addin/Connect.cs (original)
+++ incubator/npanday/trunk/dotnet/assemblies/NPanday.VisualStudio.Addin/src/main/csharp/NPanday/VisualStudio/Addin/Connect.cs Tue Jun 28 04:57:53 2011
@@ -793,6 +793,7 @@ namespace NPanday.VisualStudio.Addin
                 }
                 catch
                 {
+                    // TODO: should this really be ignored?
                 }
 
                 //check if reference is already in pom
@@ -802,11 +803,11 @@ namespace NPanday.VisualStudio.Addin
                     return;
                 }
 
-                //setup default dependecy values
+                //setup default dependency values
                 string refType = "gac_msil";
                 string refName = pReference.Name;
                 string refGroupId = pReference.Name;
-                string refToken = pReference.PublicKeyToken;
+                string refToken = pReference.PublicKeyToken.ToLower();
                 string refVersion = pReference.Version;
                 string systemPath = string.Empty;
                 string scope = string.Empty;
@@ -820,34 +821,10 @@ namespace NPanday.VisualStudio.Addin
                     refToken = pReference.Identity.Substring(0, pReference.Identity.LastIndexOf(@"\")).Replace("\\", "-");
                     refGroupId = refName;
                 }
-                else
+                else if (pReference.Type == prjReferenceType.prjReferenceTypeAssembly)
                 {
                     //if reference is assembly
-                    Assembly a = System.Reflection.Assembly.LoadWithPartialName(pReference.Name);
-
-                    if (a != null)
-                    {
-                        if (a.Location.ToLower().IndexOf(@"\gac_32\") >= 0)
-                            refType = "gac_32";
-                        else if (a.Location.ToLower().IndexOf(@"\gac_64\") >= 0)
-                            refType = "gac_64";
-                        else if (a.Location.ToLower().IndexOf(@"\gac\") >= 0)
-                            refType = "gac";
-                        else if (a.Location.ToLower().IndexOf(@"\gac-msil4\") >= 0)
-                            refType = "gac-msil4";
-                        else if (a.Location.ToLower().IndexOf(@"\gac-32-4\") >= 0)
-                            refType = "gac-32-4";
-                        else if (a.Location.ToLower().IndexOf(@"\gac-64-4\") >= 0)
-                            refType = "gac-64-4";
-                        else if (a.Location.ToLower().IndexOf(@"\gac-msil\") >= 0)
-                            refType = "gac-msil";
-
-                        if (!a.GlobalAssemblyCache)
-                        {
-                            refType = "dotnet-library";
-                        }
-                    }
-                    else if (pReference.SourceProject != null && pReference.ContainingProject.DTE.Solution.FullName == pReference.SourceProject.DTE.Solution.FullName)
+                    if (pReference.SourceProject != null && pReference.ContainingProject.DTE.Solution.FullName == pReference.SourceProject.DTE.Solution.FullName)
                     {
                         // if intra-project reference, let's mimic Add Maven Artifact
 
@@ -856,10 +833,10 @@ namespace NPanday.VisualStudio.Addin
 
                         NPanday.Model.Pom.Model solutionPOM = NPanday.Utils.PomHelperUtility.ReadPomAsModel(CurrentSolutionPom);
                         NPanday.Model.Pom.Model projectPOM = NPanday.Utils.PomHelperUtility.ReadPomAsModel(CurrentSelectedProjectPom);
-                        
+
                         refGroupId = solutionPOM.groupId;
 
-                        if (projectPOM.version != null && projectPOM.version!="0.0.0.0")
+                        if (projectPOM.version != null && projectPOM.version != "0.0.0.0")
                         {
                             refVersion = projectPOM.version;
                         }
@@ -875,19 +852,39 @@ namespace NPanday.VisualStudio.Addin
                     }
                     else
                     {
-                        scope = "system";
-                        systemPath = pReference.Path;
-                        refType = "dotnet-library";
-                        if (!iNPandayRepo)
+                        Assembly a = Assembly.ReflectionOnlyLoadFrom(pReference.Path);
+
+                        // original is probably a reference assembly, so now check if it's in the GAC
+                        // for that, we must load (runtime) instead of just reflection, or from the reference path
+                        AppDomain appDomain = AppDomain.CreateDomain("NPandayTempDomain");
+                        Assembly asm = appDomain.Load(a.FullName);
+                        if (asm.GlobalAssemblyCache)
                         {
-                            MessageBox.Show(string.Format("Warning: Build may not be portable if local references are used, Reference is not in Maven Repository or in GAC."
-                                     + "\nReference: {0}"
-                                     + "\nDeploying the reference to a Repository, will make the code portable to other machines",
-                             pReference.Name
-                         ), "Add Reference", MessageBoxButtons.OK, MessageBoxIcon.Warning);
+                            // use the original assembly to get the GAC type so we don't get the wrong image version
+                            // but use processor architecture from the GAC version as it is None otherwise
+                            refType = GacUtility.GetNPandayGacType(a.ImageRuntimeVersion, asm.GetName().ProcessorArchitecture, refToken);
+                        }
+                        else
+                        {
+                            scope = "system";
+                            systemPath = pReference.Path;
+                            refType = "dotnet-library";
+                            if (!iNPandayRepo)
+                            {
+                                MessageBox.Show(string.Format("Warning: Build may not be portable if local references are used, Reference is not in Maven Repository or in GAC."
+                                         + "\nReference: {0}"
+                                         + "\nDeploying the reference to a Repository, will make the code portable to other machines",
+                                 pReference.Name
+                             ), "Add Reference", MessageBoxButtons.OK, MessageBoxIcon.Warning);
+                            }
                         }
+                        AppDomain.Unload(appDomain);
                     }
                 }
+                else
+                {
+                    throw new Exception("Unrecognized reference type: " + pReference.Type);
+                }
 
                 Dependency dep = new Dependency();
                 dep.artifactId = refName;
@@ -908,7 +905,7 @@ namespace NPanday.VisualStudio.Addin
             }
             catch (Exception e)
             {
-                //outputWindowPane.OutputString(e.Message);
+                MessageBox.Show("Error converting reference to artifact, not added to POM: " + e.Message, "Add Reference", MessageBoxButtons.OK, MessageBoxIcon.Warning);
             }
         }