blob: 00fa0003c592d9768210ae78f5ed9a4b4f485c20 [file] [log] [blame]
using System;
using System.Collections.Generic;
using System.IO;
using Microsoft.Build.BuildEngine;
using NPanday.ProjectImporter.Parser.VisualStudioProjectTypes;
using NPanday.ProjectImporter.Digest.Model;
using NPanday.Utils;
/// Author: Leopoldo Lee Agdeppa III
namespace NPanday.ProjectImporter.Digest.Algorithms
{
public class NormalProjectDigestAlgorithm : BaseProjectDigestAlgorithm, IProjectDigestAlgorithm
{
public ProjectDigest DigestProject(Dictionary<string, object> projectMap)
{
Project project = (Project)projectMap["Project"];
if (!projectMap.ContainsKey("ProjectType"))
{
if (project.FullFileName.ToUpper().EndsWith(".CSPROJ"))
{
projectMap.Add("ProjectType",VisualStudioProjectTypeEnum.Windows__CSharp);
}
else if (project.FullFileName.ToUpper().EndsWith(".VBPROJ"))
{
projectMap.Add("ProjectType", VisualStudioProjectTypeEnum.Windows__VbDotNet);
}
}
GacUtility gac = new GacUtility();
ProjectDigest projectDigest = new ProjectDigest();
string projectBasePath = Path.GetDirectoryName(project.FullFileName);
projectDigest.ProjectType = (VisualStudioProjectTypeEnum)projectMap["ProjectType"];
projectDigest.FullFileName = project.FullFileName;
projectDigest.FullDirectoryName = Path.GetDirectoryName(project.FullFileName);
FileInfo existingPomFile = new FileInfo(Path.Combine(projectDigest.FullDirectoryName, "pom.xml"));
if (existingPomFile.Exists)
{
projectDigest.ExistingPom = PomHelperUtility.ReadPomAsModel(existingPomFile);
}
if ((projectDigest.ProjectType & VisualStudioProjectTypeEnum.Windows__CSharp) == VisualStudioProjectTypeEnum.Windows__CSharp)
{
projectDigest.Language = "csharp";
}
else if ((projectDigest.ProjectType & VisualStudioProjectTypeEnum.Windows__VbDotNet) == VisualStudioProjectTypeEnum.Windows__VbDotNet)
{
projectDigest.Language = "vb";
}
List<Reference> references = new List<Reference>();
List<ProjectReference> projectReferences = new List<ProjectReference>();
if (projectMap.ContainsKey("InterProjectReferences")
&& projectMap["InterProjectReferences"] != null
&& projectMap["InterProjectReferences"] is Microsoft.Build.BuildEngine.Project[]
)
{
Microsoft.Build.BuildEngine.Project[] interProjectReferences = (Microsoft.Build.BuildEngine.Project[])projectMap["InterProjectReferences"];
foreach (Microsoft.Build.BuildEngine.Project p in interProjectReferences)
{
ProjectReference prjRef = new ProjectReference(projectBasePath);
prjRef.ProjectPath = p.FullFileName;
prjRef.Name = GetProjectAssemblyName(Path.GetFullPath(prjRef.ProjectFullPath));
projectReferences.Add(prjRef);
}
}
List<Compile> compiles = new List<Compile>();
List<None> nones = new List<None>();
List<WebReferenceUrl> webReferenceUrls = new List<WebReferenceUrl>();
List<Content> contents = new List<Content>();
List<WebReferences> webReferencesList = new List<WebReferences>();
List<EmbeddedResource> embeddedResources = new List<EmbeddedResource>();
List<BootstrapperPackage> bootstrapperPackages = new List<BootstrapperPackage>();
List<Folder> folders = new List<Folder>();
List<string> globalNamespaceImports = new List<string>();
List<ComReference> comReferenceList = new List<ComReference>();
DigestBuildProperties(project, projectDigest);
DigestBuildItems(project, projectDigest, projectBasePath, projectReferences, gac, references, compiles, nones, webReferenceUrls, contents, folders, webReferencesList, embeddedResources, bootstrapperPackages, globalNamespaceImports, comReferenceList);
DigestImports(project);
projectDigest.ProjectReferences = projectReferences.ToArray();
projectDigest.References = references.ToArray();
projectDigest.Compiles = compiles.ToArray();
projectDigest.Contents = contents.ToArray();
projectDigest.Nones = nones.ToArray();
projectDigest.WebReferenceUrls = webReferenceUrls.ToArray();
projectDigest.WebReferences = webReferencesList.ToArray();
projectDigest.EmbeddedResources = embeddedResources.ToArray();
projectDigest.BootstrapperPackages = bootstrapperPackages.ToArray();
projectDigest.Folders = folders.ToArray();
projectDigest.GlobalNamespaceImports = globalNamespaceImports.ToArray();
projectDigest.ComReferenceList = comReferenceList.ToArray();
return projectDigest;
}
private static void DigestImports(Project project)
{
foreach (Import import in project.Imports)
{
if (!import.IsImported)
{
if (
@"$(MSBuildBinPath)\Microsoft.CSharp.targets".Equals(import.ProjectPath, StringComparison.OrdinalIgnoreCase)
|| @"$(MSBuildBinPath)\Microsoft.VisualBasic.targets".Equals(import.ProjectPath, StringComparison.OrdinalIgnoreCase)
)
{
// Ignore these this are not used by the compiler
}
else if (
@"$(MSBuildToolsPath)\Microsoft.CSharp.targets".Equals(import.ProjectPath, StringComparison.OrdinalIgnoreCase)
|| @"$(MSBuildToolsPath)\Microsoft.VisualBasic.targets".Equals(import.ProjectPath, StringComparison.OrdinalIgnoreCase)
)
{
// Ignore these this are not used by the compiler
}
else
{
// TODO: check for implimentations for imports
}
}
}
}
private static void DigestBuildItems(Project project, ProjectDigest projectDigest, string projectBasePath, ICollection<ProjectReference> projectReferences, GacUtility gac, 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)
{
foreach (BuildItemGroup buildItemGroup in project.ItemGroups)
{
foreach (BuildItem buildItem in buildItemGroup)
{
if (!buildItem.IsImported)
{
switch (buildItem.Name)
{
case "ProjectReference":
ProjectReference prjRef = new ProjectReference(projectBasePath);
prjRef.ProjectPath = buildItem.Include;
prjRef.Name = GetProjectAssemblyName(Path.GetFullPath(prjRef.ProjectFullPath));
projectReferences.Add(prjRef);
break;
case "Reference":
Reference reference = new Reference(projectBasePath, gac);
//quick workaround for cases of importing .net 4.0 targeted projects, as their referneces has to be also for
//.net framework 4.0 (that is their version in GAC is 4.0.0.0). Then we will use this
if (projectDigest.TargetFramework == "4.0")
{
reference.Version = "4.0.0.0"; //Then we will use this version when resolving references from GAC
}
//set processorArchitecture property to platform, it will be used by GacUtility in
// order to resolve artifact to right processor architecture
if (!string.IsNullOrEmpty(projectDigest.Platform))
{
reference.ProcessorArchitecture = projectDigest.Platform;
}
string hintPath = buildItem.GetMetadata("HintPath");
if (!string.IsNullOrEmpty(hintPath))
{
string fullHint = Path.Combine(projectBasePath, hintPath);
if(File.Exists(fullHint))
reference.HintPath = Path.GetFullPath(fullHint);
else
reference.HintPath = fullHint;
}
if (string.IsNullOrEmpty(reference.HintPath) || !(new FileInfo(reference.HintPath).Exists))
{
reference.AssemblyInfo = buildItem.Include;
}
if ("NUnit.Framework".Equals(reference.Name, StringComparison.OrdinalIgnoreCase))
{
reference.Name = "NUnit.Framework";
projectDigest.UnitTest = true;
}
if (!string.IsNullOrEmpty(reference.Name))
{
references.Add(reference);
}
break;
case "Compile":
Compile compile = new Compile(projectBasePath);
compile.IncludePath = buildItem.Include;
compile.AutoGen = buildItem.GetMetadata("AutoGen");
compile.DesignTimeSharedInput = buildItem.GetMetadata("DesignTimeSharedInput");
compile.DependentUpon = buildItem.GetMetadata("DependentUpon");
compile.DesignTime = buildItem.GetMetadata("DesignTime");
compile.SubType = buildItem.GetMetadata("SubType");
compiles.Add(compile);
break;
case "None":
None none = new None(projectBasePath);
none.IncludePath = buildItem.Include;
none.Link = buildItem.GetMetadata("Link");
none.Generator = buildItem.GetMetadata("Generator");
none.LastGenOutput = buildItem.GetMetadata("LastGenOutput");
none.DependentUpon = buildItem.GetMetadata("DependentUpon");
nones.Add(none);
//add included web reference when reimporting
if (buildItem.Include.Contains(".wsdl"))
{
string path = Path.GetDirectoryName(buildItem.Include) + "\\";
WebReferenceUrl webUrl = new WebReferenceUrl();
webUrl.UrlBehavior = "Dynamic";
webUrl.RelPath = path;
if (!webRefExists(webUrl, webReferenceUrls))
{
webReferenceUrls.Add(webUrl);
}
}
break;
case "WebReferenceUrl":
WebReferenceUrl web = new WebReferenceUrl();
web.UrlBehavior = buildItem.GetMetadata("UrlBehavior");
web.RelPath = buildItem.GetMetadata("RelPath");
web.UpdateFromURL = buildItem.GetMetadata("UpdateFromURL");
web.ServiceLocationURL = buildItem.GetMetadata("ServiceLocationURL");
web.CachedDynamicPropName = buildItem.GetMetadata("CachedDynamicPropName");
web.CachedAppSettingsObjectName = buildItem.GetMetadata("CachedAppSettingsObjectName");
web.CachedSettingsPropName = buildItem.GetMetadata("CachedSettingsPropName");
if (!webRefExists(web, webReferenceUrls))
{
webReferenceUrls.Add(web);
}
break;
case "COMReference":
ComReference comRef = new ComReference();
comRef.Include = buildItem.Include;
comRef.Guid = buildItem.GetMetadata("Guid");
comRef.VersionMajor = buildItem.GetMetadata("VersionMajor");
comRef.VersionMinor = buildItem.GetMetadata("VersionMinor");
comRef.Lcid = buildItem.GetMetadata("Lcid");
comRef.Isolated = buildItem.GetMetadata("Isolated");
comRef.WrapperTool = buildItem.GetMetadata("WrapperTool");
comReferenceList.Add(comRef);
break;
case "Content":
Content content = new Content(projectBasePath);
content.IncludePath = buildItem.Include;
contents.Add(content);
//add web reference in <includes> tag of compile-plugin
if (content.IncludePath.Contains("Web References"))
{
Compile compileWebRef = new Compile(projectBasePath);
compileWebRef.IncludePath = buildItem.Include;
compiles.Add(compileWebRef);
}
break;
case "Folder":
Folder folder = new Folder(projectBasePath);
folder.IncludePath = buildItem.Include;
folders.Add(folder);
break;
case "WebReferences":
WebReferences webReferences = new WebReferences(projectBasePath);
webReferences.IncludePath = buildItem.Include;
webReferencesList.Add(webReferences);
break;
case "EmbeddedResource":
EmbeddedResource embeddedResource = new EmbeddedResource(projectBasePath);
embeddedResource.IncludePath = buildItem.Include;
embeddedResource.DependentUpon = buildItem.GetMetadata("DependentUpon");
embeddedResource.SubType = buildItem.GetMetadata("SubType");
embeddedResource.Generator = buildItem.GetMetadata("Generator");
embeddedResource.LastGenOutput = buildItem.GetMetadata("LastGenOutput");
embeddedResources.Add(embeddedResource);
break;
case "BootstrapperPackage":
BootstrapperPackage bootstrapperPackage = new BootstrapperPackage(projectBasePath);
bootstrapperPackage.IncludePath = buildItem.Include;
bootstrapperPackage.Visible = buildItem.GetMetadata("Visible");
bootstrapperPackage.ProductName = buildItem.GetMetadata("ProductName");
bootstrapperPackage.Install = buildItem.GetMetadata("Install");
bootstrapperPackages.Add(bootstrapperPackage);
break;
case "Import":
globalNamespaceImports.Add(buildItem.Include);
break;
case "BaseApplicationManifest":
projectDigest.BaseApplicationManifest = buildItem.Include;
break;
default:
Console.WriteLine("Unhandled ItemGroup: " + buildItem.Name);
break;
}
}
}
}
}
public static bool webRefExists(WebReferenceUrl webUrl, ICollection<WebReferenceUrl> webReferenceUrls)
{
bool webRefExists = false;
foreach (WebReferenceUrl w in webReferenceUrls)
{
if (w.RelPath == webUrl.RelPath)
{
webRefExists = true;
}
}
return webRefExists;
}
private static void DigestBuildProperties(Project project, ProjectDigest projectDigest)
{
foreach (BuildPropertyGroup buildPropertyGroup in project.PropertyGroups)
{
foreach (BuildProperty buildProperty in buildPropertyGroup)
{
if (!buildProperty.IsImported)
{
if ("RootNameSpace".Equals(buildProperty.Name, StringComparison.OrdinalIgnoreCase))
{
projectDigest.RootNamespace = buildProperty.Value;
}
else if ("AssemblyName".Equals(buildProperty.Name, StringComparison.OrdinalIgnoreCase))
{
projectDigest.AssemblyName = buildProperty.Value;
}
else if ("StartupObject".Equals(buildProperty.Name, StringComparison.OrdinalIgnoreCase))
{
projectDigest.StartupObject = buildProperty.Value;
}
else if ("OutputType".Equals(buildProperty.Name, StringComparison.OrdinalIgnoreCase))
{
projectDigest.OutputType = buildProperty.Value;
}
else if ("SignAssembly".Equals(buildProperty.Name, StringComparison.OrdinalIgnoreCase))
{
projectDigest.SignAssembly = buildProperty.Value;
}
else if ("AssemblyOriginatorKeyFile".Equals(buildProperty.Name, StringComparison.OrdinalIgnoreCase))
{
projectDigest.AssemblyOriginatorKeyFile = buildProperty.Value;
}
else if ("DelaySign".Equals(buildProperty.Name, StringComparison.OrdinalIgnoreCase))
{
projectDigest.DelaySign = buildProperty.Value;
}
else if ("Optimize".Equals(buildProperty.Name, StringComparison.OrdinalIgnoreCase))
{
projectDigest.Optimize = buildProperty.Value;
}
else if ("AllowUnsafeBlocks".Equals(buildProperty.Name, StringComparison.OrdinalIgnoreCase))
{
projectDigest.AllowUnsafeBlocks = buildProperty.Value;
}
else if ("DefineConstants".Equals(buildProperty.Name, StringComparison.OrdinalIgnoreCase))
{
projectDigest.DefineConstants = buildProperty.Value;
}
else if ("ApplicationIcon".Equals(buildProperty.Name, StringComparison.OrdinalIgnoreCase))
{
projectDigest.ApplicationIcon = buildProperty.Value;
}
else if ("Win32Resource".Equals(buildProperty.Name, StringComparison.OrdinalIgnoreCase))
{
projectDigest.Win32Resource = buildProperty.Value;
}
else if ("ProjectGuid".Equals(buildProperty.Name, StringComparison.OrdinalIgnoreCase))
{
projectDigest.ProjectGuid = buildProperty.Value;
}
else if ("Configuration".Equals(buildProperty.Name, StringComparison.OrdinalIgnoreCase))
{
projectDigest.Configuration = buildProperty.Value;
}
else if ("BaseIntermediateOutputPath".Equals(buildProperty.Name, StringComparison.OrdinalIgnoreCase))
{
projectDigest.BaseIntermediateOutputPath = buildProperty.Value;
}
else if ("OutputPath".Equals(buildProperty.Name, StringComparison.OrdinalIgnoreCase))
{
projectDigest.OutputPath = buildProperty.Value;
}
else if ("TreatWarningsAsErrors".Equals(buildProperty.Name, StringComparison.OrdinalIgnoreCase))
{
projectDigest.TreatWarningsAsErrors = buildProperty.Value;
}
else if ("Platform".Equals(buildProperty.Name, StringComparison.OrdinalIgnoreCase))
{
projectDigest.Platform = buildProperty.Value;
}
else if ("ProductVersion".Equals(buildProperty.Name, StringComparison.OrdinalIgnoreCase))
{
projectDigest.ProductVersion = buildProperty.Value;
}
else if ("SchemaVersion".Equals(buildProperty.Name, StringComparison.OrdinalIgnoreCase))
{
projectDigest.SchemaVersion = buildProperty.Value;
}
else if ("TargetFrameworkVersion".Equals(buildProperty.Name, StringComparison.OrdinalIgnoreCase))
{
// changed the version to the more specific version
string frameworkVersion = buildProperty.Value.Substring(1);
if ("2.0".Equals(buildProperty.Value.Substring(1)))
{
frameworkVersion = "2.0.50727";
}
projectDigest.TargetFramework = frameworkVersion;
}
else if ("AppDesignerFolder".Equals(buildProperty.Name, StringComparison.OrdinalIgnoreCase))
{
projectDigest.AppDesignerFolder = buildProperty.Value;
}
else if ("DebugSymbols".Equals(buildProperty.Name, StringComparison.OrdinalIgnoreCase))
{
projectDigest.DebugSymbols = buildProperty.Value;
}
else if ("DebugType".Equals(buildProperty.Name, StringComparison.OrdinalIgnoreCase))
{
projectDigest.DebugType = buildProperty.Value;
}
else if ("ErrorReport".Equals(buildProperty.Name, StringComparison.OrdinalIgnoreCase))
{
projectDigest.ErrorReport = buildProperty.Value;
}
else if ("WarningLevel".Equals(buildProperty.Name, StringComparison.OrdinalIgnoreCase))
{
projectDigest.WarningLevel = buildProperty.Value;
}
else if ("DocumentationFile".Equals(buildProperty.Name, StringComparison.OrdinalIgnoreCase))
{
projectDigest.DocumentationFile = buildProperty.Value;
}
else if ("PostBuildEvent".Equals(buildProperty.Name, StringComparison.OrdinalIgnoreCase))
{
projectDigest.PostBuildEvent = buildProperty.Value;
}
else if ("PublishUrl".Equals(buildProperty.Name, StringComparison.OrdinalIgnoreCase))
{
projectDigest.PublishUrl = buildProperty.Value;
}
else if ("Install".Equals(buildProperty.Name, StringComparison.OrdinalIgnoreCase))
{
projectDigest.Install = buildProperty.Value;
}
else if ("InstallFrom".Equals(buildProperty.Name, StringComparison.OrdinalIgnoreCase))
{
projectDigest.InstallFrom = buildProperty.Value;
}
else if ("UpdateEnabled".Equals(buildProperty.Name, StringComparison.OrdinalIgnoreCase))
{
projectDigest.UpdateEnabled = buildProperty.Value;
}
else if ("UpdateMode".Equals(buildProperty.Name, StringComparison.OrdinalIgnoreCase))
{
projectDigest.UpdateMode = buildProperty.Value;
}
else if ("UpdateInterval".Equals(buildProperty.Name, StringComparison.OrdinalIgnoreCase))
{
projectDigest.UpdateInterval = buildProperty.Value;
}
else if ("UpdateIntervalUnits".Equals(buildProperty.Name, StringComparison.OrdinalIgnoreCase))
{
projectDigest.UpdateIntervalUnits = buildProperty.Value;
}
else if ("UpdatePeriodically".Equals(buildProperty.Name, StringComparison.OrdinalIgnoreCase))
{
projectDigest.UpdatePeriodically = buildProperty.Value;
}
else if ("UpdateRequired".Equals(buildProperty.Name, StringComparison.OrdinalIgnoreCase))
{
projectDigest.UpdateRequired = buildProperty.Value;
}
else if ("MapFileExtensions".Equals(buildProperty.Name, StringComparison.OrdinalIgnoreCase))
{
projectDigest.MapFileExtensions = buildProperty.Value;
}
else if ("ApplicationVersion".Equals(buildProperty.Name, StringComparison.OrdinalIgnoreCase))
{
projectDigest.ApplicationVersion = buildProperty.Value;
}
else if ("IsWebBootstrapper".Equals(buildProperty.Name, StringComparison.OrdinalIgnoreCase))
{
projectDigest.IsWebBootstrapper = buildProperty.Value;
}
else if ("BootstrapperEnabled".Equals(buildProperty.Name, StringComparison.OrdinalIgnoreCase))
{
projectDigest.BootstrapperEnabled = buildProperty.Value;
}
else if ("PreBuildEvent".Equals(buildProperty.Name, StringComparison.OrdinalIgnoreCase))
{
projectDigest.PreBuildEvent = buildProperty.Value;
}
else if ("MyType".Equals(buildProperty.Name, StringComparison.OrdinalIgnoreCase))
{
projectDigest.MyType = buildProperty.Value;
}
else if ("DefineDebug".Equals(buildProperty.Name, StringComparison.OrdinalIgnoreCase))
{
projectDigest.DefineDebug = buildProperty.Value;
}
else if ("DefineTrace".Equals(buildProperty.Name, StringComparison.OrdinalIgnoreCase))
{
projectDigest.DefineTrace = buildProperty.Value;
}
else if ("NoWarn".Equals(buildProperty.Name, StringComparison.OrdinalIgnoreCase))
{
projectDigest.NoWarn = buildProperty.Value;
}
else if ("WarningsAsErrors".Equals(buildProperty.Name, StringComparison.OrdinalIgnoreCase))
{
projectDigest.WarningsAsErrors = buildProperty.Value;
}
else if ("ProjectTypeGuids".Equals(buildProperty.Name, StringComparison.OrdinalIgnoreCase))
{
if (!string.IsNullOrEmpty(buildProperty.Value))
{
try
{
VisualStudioProjectTypeEnum t = VisualStudioProjectType.GetVisualStudioProjectType(buildProperty.Value);
projectDigest.ProjectType = t;
}
catch
{
throw;
}
}
}
else
{
Console.WriteLine("Unhandled Property:" + buildProperty.Name);
}
}
}
}
}
}
}