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);
}
}