You are viewing a plain text version of this content. The canonical link for it is here.
Posted to nmaven-commits@incubator.apache.org by si...@apache.org on 2007/02/23 22:54:04 UTC
svn commit: r511157 - in
/incubator/nmaven/branches/SI_IDE/assemblies/NMaven.Core/src:
main/csharp/Core/ main/csharp/Core/Impl/ test/csharp/Core/
test/csharp/Core/Impl/
Author: sisbell
Date: Fri Feb 23 14:54:03 2007
New Revision: 511157
URL: http://svn.apache.org/viewvc?view=rev&rev=511157
Log:
Handles generating Solution files and project files. API more flexible. Still contains some hard-coded values.
Added:
incubator/nmaven/branches/SI_IDE/assemblies/NMaven.Core/src/main/csharp/Core/IProjectGenerator.cs
incubator/nmaven/branches/SI_IDE/assemblies/NMaven.Core/src/main/csharp/Core/IProjectReference.cs
incubator/nmaven/branches/SI_IDE/assemblies/NMaven.Core/src/main/csharp/Core/IProjectRepository.cs
incubator/nmaven/branches/SI_IDE/assemblies/NMaven.Core/src/main/csharp/Core/Impl/ProjectGeneratorImpl.cs
incubator/nmaven/branches/SI_IDE/assemblies/NMaven.Core/src/main/csharp/Core/Impl/ProjectReferenceImpl.cs
incubator/nmaven/branches/SI_IDE/assemblies/NMaven.Core/src/main/csharp/Core/Impl/ProjectRepositoryImpl.cs
incubator/nmaven/branches/SI_IDE/assemblies/NMaven.Core/src/test/csharp/Core/
incubator/nmaven/branches/SI_IDE/assemblies/NMaven.Core/src/test/csharp/Core/Impl/
incubator/nmaven/branches/SI_IDE/assemblies/NMaven.Core/src/test/csharp/Core/Impl/NMavenContextImplTest.cs
Removed:
incubator/nmaven/branches/SI_IDE/assemblies/NMaven.Core/src/main/csharp/Core/Impl/NMavenContextImpl.cs
incubator/nmaven/branches/SI_IDE/assemblies/NMaven.Core/src/main/csharp/Core/NMavenContext.cs
Added: incubator/nmaven/branches/SI_IDE/assemblies/NMaven.Core/src/main/csharp/Core/IProjectGenerator.cs
URL: http://svn.apache.org/viewvc/incubator/nmaven/branches/SI_IDE/assemblies/NMaven.Core/src/main/csharp/Core/IProjectGenerator.cs?view=auto&rev=511157
==============================================================================
--- incubator/nmaven/branches/SI_IDE/assemblies/NMaven.Core/src/main/csharp/Core/IProjectGenerator.cs (added)
+++ incubator/nmaven/branches/SI_IDE/assemblies/NMaven.Core/src/main/csharp/Core/IProjectGenerator.cs Fri Feb 23 14:54:03 2007
@@ -0,0 +1,24 @@
+using System;
+using System.IO;
+using System.Collections.Generic;
+using NMaven.Model;
+
+namespace NMaven.Core
+{
+ /// <summary>
+ /// Description of Interface1.
+ /// </summary>
+ public interface IProjectGenerator
+ {
+
+ IProjectReference generateProjectFor(NMaven.Model.Model model,
+ DirectoryInfo sourceFileDirectory,
+ string projectFileName,
+ List<IProjectReference> projectReferences);
+
+ void generateSolutionFor(List<IProjectReference> projectReferences);
+
+ NMaven.Model.Model createPomModelFor(string fileName);
+
+ }
+}
Added: incubator/nmaven/branches/SI_IDE/assemblies/NMaven.Core/src/main/csharp/Core/IProjectReference.cs
URL: http://svn.apache.org/viewvc/incubator/nmaven/branches/SI_IDE/assemblies/NMaven.Core/src/main/csharp/Core/IProjectReference.cs?view=auto&rev=511157
==============================================================================
--- incubator/nmaven/branches/SI_IDE/assemblies/NMaven.Core/src/main/csharp/Core/IProjectReference.cs (added)
+++ incubator/nmaven/branches/SI_IDE/assemblies/NMaven.Core/src/main/csharp/Core/IProjectReference.cs Fri Feb 23 14:54:03 2007
@@ -0,0 +1,30 @@
+
+using System;
+using System.IO;
+
+namespace NMaven.Core
+{
+ /// <summary>
+ /// Description of IProjectReference.
+ /// </summary>
+ public interface IProjectReference
+ {
+ FileInfo CsProjFile
+ {
+ get;
+ set;
+ }
+
+ string ProjectName
+ {
+ get;
+ set;
+ }
+
+ Guid ProjectGuid
+ {
+ get;
+ set;
+ }
+ }
+}
Added: incubator/nmaven/branches/SI_IDE/assemblies/NMaven.Core/src/main/csharp/Core/IProjectRepository.cs
URL: http://svn.apache.org/viewvc/incubator/nmaven/branches/SI_IDE/assemblies/NMaven.Core/src/main/csharp/Core/IProjectRepository.cs?view=auto&rev=511157
==============================================================================
--- incubator/nmaven/branches/SI_IDE/assemblies/NMaven.Core/src/main/csharp/Core/IProjectRepository.cs (added)
+++ incubator/nmaven/branches/SI_IDE/assemblies/NMaven.Core/src/main/csharp/Core/IProjectRepository.cs Fri Feb 23 14:54:03 2007
@@ -0,0 +1,17 @@
+
+using System;
+using System.Collections.Generic;
+
+namespace NMaven.Core
+{
+ /// <summary>
+ /// Description of IProjectRepositorycs.
+ /// </summary>
+ public interface IProjectRepository
+ {
+ List<IProjectObjectModel> getProjectObjectModelsFor(NMaven.Model.Model rootPom);
+
+ void init(IProjectGenerator projectGenerator);
+
+ }
+}
Added: incubator/nmaven/branches/SI_IDE/assemblies/NMaven.Core/src/main/csharp/Core/Impl/ProjectGeneratorImpl.cs
URL: http://svn.apache.org/viewvc/incubator/nmaven/branches/SI_IDE/assemblies/NMaven.Core/src/main/csharp/Core/Impl/ProjectGeneratorImpl.cs?view=auto&rev=511157
==============================================================================
--- incubator/nmaven/branches/SI_IDE/assemblies/NMaven.Core/src/main/csharp/Core/Impl/ProjectGeneratorImpl.cs (added)
+++ incubator/nmaven/branches/SI_IDE/assemblies/NMaven.Core/src/main/csharp/Core/Impl/ProjectGeneratorImpl.cs Fri Feb 23 14:54:03 2007
@@ -0,0 +1,273 @@
+using System;
+using NMaven.Core;
+using NMaven.Model;
+using System.IO;
+using Microsoft.Build.BuildEngine;
+using System.Xml.Serialization;
+using System.Collections.Generic;
+using System.Reflection;
+using System.Text;
+
+namespace NMaven.Core.Impl
+{
+ /// <summary>
+ /// Description of ProjectGeneratorImpl.
+ /// </summary>
+ public class ProjectGeneratorImpl : IProjectGenerator
+ {
+
+ public ProjectGeneratorImpl()
+ {
+ }
+
+ public IProjectReference generateProjectFor(NMaven.Model.Model model,
+ DirectoryInfo sourceFileDirectory,
+ string projectFileName,
+ List<IProjectReference> projectReferences)
+ {
+ Guid projectGuid = Guid.NewGuid();
+
+ if(projectReferences == null) projectReferences = new List<IProjectReference>();
+ Project project = getProjectFromPomModel(model, sourceFileDirectory, projectFileName, projectGuid,
+ @"..\..\..\target\bin\Debug\", projectReferences);
+ FileInfo fileInfo = new FileInfo(sourceFileDirectory.FullName + @"\" + projectFileName + ".csproj");
+ project.Save(fileInfo.FullName);
+
+ IProjectReference projectReference = new ProjectReferenceImpl();
+ projectReference.CsProjFile = fileInfo;
+ projectReference.ProjectGuid = projectGuid;
+ projectReference.ProjectName = projectFileName;
+ return projectReference;
+ }
+
+ public void generateSolutionFor(List<IProjectReference> projectReferences)
+ {
+ TextWriter writer =
+ new StreamWriter(@"C:\Documents and Settings\shane\nmaven-apache\SI_IDE\assemblies\test.sln", false, System.Text.Encoding.UTF8);
+ writer.WriteLine("");
+ writer.WriteLine("Microsoft Visual Studio Solution File, Format Version 9.00");
+ writer.WriteLine("# Visual Studio 2005");
+ writer.WriteLine("# SharpDevelop 2.1.0.2376");
+
+ Guid solutionGuid = Guid.NewGuid();
+ foreach(IProjectReference projectReference in projectReferences)
+ {
+ writer.Write("Project(\"{");
+ writer.Write("FAE04EC0-301F-11D3-BF4B-00C04F79EFBC");
+ writer.Write("}\") = \"");
+ writer.Write(projectReference.ProjectName);
+ writer.Write("\", \"");
+ writer.Write(projectReference.CsProjFile.FullName);
+ writer.Write("\", \"{");
+ writer.Write(projectReference.ProjectGuid.ToString());
+ writer.WriteLine("}\"");
+ writer.WriteLine("EndProject");
+
+ }
+ writer.Flush();
+ writer.Close();
+ }
+
+ public NMaven.Model.Model createPomModelFor(string fileName)
+ {
+ TextReader reader = new StreamReader(fileName);
+ XmlSerializer serializer = new XmlSerializer(typeof(NMaven.Model.Model));
+ return (NMaven.Model.Model) serializer.Deserialize(reader);
+ }
+
+ private Project createProjectFor(string fileName)
+ {
+ Engine engine = new Engine(@"C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727");
+ Project project = new Project(engine);
+ project.Load(@fileName);
+ return project;
+ }
+
+
+ private Project getProjectFromPomModel(NMaven.Model.Model model,
+ DirectoryInfo sourceFileDirectory,
+ string assemblyName,
+ Guid projectGuid,
+ string assemblyOutputPath,
+ List<IProjectReference> projectReferences)
+ {
+ Engine engine = new Engine(@"C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727");
+ Project project = new Project(engine);
+
+
+ //Main Properties
+ BuildPropertyGroup groupProject = project.AddNewPropertyGroup(false);
+ groupProject.AddNewProperty("ProjectGuid", "{" + projectGuid.ToString() + "}");
+ BuildProperty buildProperty = groupProject.AddNewProperty("Configuration", "Debug");
+ buildProperty.Condition = " '$(Configuration)' == '' ";
+ groupProject.AddNewProperty("RootNameSpace", model.groupId);
+ groupProject.AddNewProperty("AssemblyName", assemblyName);
+ groupProject.AddNewProperty("OutputType", getOutputType(model.packaging));
+
+ //Debug Properties
+ groupProject = project.AddNewPropertyGroup(false);
+ buildProperty.Condition = " '$(Configuration)' == '' ";
+ groupProject.AddNewProperty( "OutputPath", assemblyOutputPath, false);
+
+ project.AddNewImport(@"$(MSBuildBinPath)\Microsoft.CSharp.Targets", null);
+
+ addProjectDependencies(project, model, sourceFileDirectory);
+ addFoldersToProject(project, null, sourceFileDirectory, sourceFileDirectory);
+ addClassFilesToProject(project, null, sourceFileDirectory, sourceFileDirectory);
+ addProjectReferences(project, assemblyName, projectReferences);
+ return project;
+
+ }
+
+ private void addProjectReferences(Project project, string projectName, List<IProjectReference> projectReferences)
+ {
+ BuildItemGroup itemGroup = project.AddNewItemGroup();
+ foreach(IProjectReference projectReference in projectReferences)
+ {
+ BuildItem buildItem = itemGroup.AddNewItem("ProjectReference", projectReference.CsProjFile.FullName);
+ buildItem.SetMetadata("Project", "{" + projectReference.ProjectGuid.ToString() + "}");
+ buildItem.SetMetadata("Name", projectName);
+ }
+ }
+
+ private void addFoldersToProject(Project project, BuildItemGroup folderGroup, DirectoryInfo rootDirectory, DirectoryInfo sourceFileDirectory)
+ {
+ DirectoryInfo[] directoryInfos = rootDirectory.GetDirectories();
+ if(directoryInfos != null && directoryInfos.Length > 0)
+ {
+ if(folderGroup == null) folderGroup = project.AddNewItemGroup();
+
+ foreach(DirectoryInfo di in directoryInfos)
+ {
+ if(di.FullName.Contains(".svn") || di.FullName.Contains(@"obj") || di.FullName.Contains(@"bin"))
+ continue;
+ folderGroup.AddNewItem("Folder", di.FullName.Substring(sourceFileDirectory.FullName.Length));
+ addFoldersToProject(project, folderGroup, di, sourceFileDirectory);
+ }
+ }
+ }
+
+ private void addClassFilesToProject(Project project, BuildItemGroup compileGroup, DirectoryInfo rootDirectory, DirectoryInfo sourceFileDirectory)
+ {
+ DirectoryInfo[] directoryInfos = rootDirectory.GetDirectories();
+ if(directoryInfos != null && directoryInfos.Length > 0)
+ {
+ if(compileGroup == null) compileGroup = project.AddNewItemGroup();
+
+ foreach(DirectoryInfo di in directoryInfos)
+ {
+ if(di.FullName.Contains(".svn") || di.FullName.Contains("obj") || di.FullName.Contains("bin"))
+ continue;
+ foreach(FileInfo fileInfo in di.GetFiles())
+ {
+ BuildItem buildItem =
+ compileGroup.AddNewItem("Compile",
+ fileInfo.FullName.Substring(sourceFileDirectory.FullName.Length));
+ //buildItem.SetMetadata("Link", fileInfo.FullName.Substring(sourcedir.FullName.Length + 1));
+ }
+ addClassFilesToProject(project, compileGroup, di, sourceFileDirectory);
+ }
+ }
+ }
+
+ private void addProjectDependencies(Project project, NMaven.Model.Model model, DirectoryInfo sourceFileDirectory)
+ {
+
+ BuildItemGroup group = project.AddNewItemGroup();
+ group.AddNewItem("Reference", "System.Xml");
+
+ foreach(Dependency dependency in model.dependencies) {
+ String repoPath = Environment.GetEnvironmentVariable("HOMEDRIVE")
+ + Environment.GetEnvironmentVariable("HOMEPATH")
+ + @"\.m2\repository\" + dependency.groupId.Replace(".", "\\")
+ + "\\" + dependency.artifactId + "\\" + dependency.version + "\\" + dependency.artifactId + ".dll";
+ BuildItem buildItem = group.AddNewItem("Reference", dependency.artifactId);
+ if(!dependency.GetType().Equals("gac")) buildItem.SetMetadata("HintPath", repoPath, false);
+ }
+
+ DirectoryInfo[] directoryInfos = sourceFileDirectory.GetDirectories();
+
+ ClassParser classParser = new ClassParser();
+ List<FileInfo> fileInfos = new List<FileInfo>();
+ addFileInfosFromSourceDirectories(sourceFileDirectory, fileInfos);
+ List<string> dependencies = classParser.getDependencies(fileInfos);
+ foreach(string dependency in dependencies)
+ {
+ try {
+ DirectoryInfo fileInfo = new DirectoryInfo(@"C:\WINDOWS\assembly\GAC_MSIL\" + dependency);
+ if(fileInfo.Exists) {
+ group.AddNewItem("Reference", dependency);
+ } else
+ Console.WriteLine("FNE: " + fileInfo.FullName);
+ }
+ catch(Exception e)
+ {
+ Console.WriteLine(e.Message);
+ }
+
+ }
+ }
+
+
+ private void addFileInfosFromSourceDirectories(DirectoryInfo sourceFileDirectory, List<FileInfo> fileInfos )
+ {
+ DirectoryInfo[] directoryInfos = sourceFileDirectory.GetDirectories();
+ if(directoryInfos != null && directoryInfos.Length > 0)
+ {
+ foreach(DirectoryInfo di in directoryInfos)
+ {
+ if(di.FullName.Contains(".svn") || di.FullName.Contains("obj") || di.FullName.Contains("bin"))
+ continue;
+ fileInfos.AddRange(di.GetFiles());
+ addFileInfosFromSourceDirectories(di, fileInfos);
+ }
+ }
+ }
+
+ private string getOutputType(String type)
+ {
+ if (type.Equals("library")) return "Library";
+ else if (type.Equals("exe")) return "Exe";
+ else if (type.Equals("winexe")) return "WinExe";
+ return null;
+ }
+
+ private class ClassParser {
+
+ public List<string> getDependencies(List<FileInfo> fileInfos)
+ {
+ List<string> dependencies = new List<string>();
+ foreach(FileInfo fileInfo in fileInfos)
+ {
+ try
+ {
+ using (StreamReader sr = new StreamReader(fileInfo.FullName))
+ {
+ String line;
+ while ((line = sr.ReadLine()) != null)
+ {
+ if (line.StartsWith("namespace")) break;
+ if (line.StartsWith("//")) continue;
+ if (line.StartsWith("using")) {
+ string[] tokens = line.Remove(line.Length - 1).Split(new char[1]{' '});
+ if(!dependencies.Contains(tokens[1]))
+ {
+ dependencies.Add(tokens[1]);
+ }
+ }
+ }
+ }
+ }
+ catch (Exception e)
+ {
+ Console.WriteLine(e.Message);
+ }
+
+ }
+
+ return dependencies;
+ }
+
+ }
+ }
+}
Added: incubator/nmaven/branches/SI_IDE/assemblies/NMaven.Core/src/main/csharp/Core/Impl/ProjectReferenceImpl.cs
URL: http://svn.apache.org/viewvc/incubator/nmaven/branches/SI_IDE/assemblies/NMaven.Core/src/main/csharp/Core/Impl/ProjectReferenceImpl.cs?view=auto&rev=511157
==============================================================================
--- incubator/nmaven/branches/SI_IDE/assemblies/NMaven.Core/src/main/csharp/Core/Impl/ProjectReferenceImpl.cs (added)
+++ incubator/nmaven/branches/SI_IDE/assemblies/NMaven.Core/src/main/csharp/Core/Impl/ProjectReferenceImpl.cs Fri Feb 23 14:54:03 2007
@@ -0,0 +1,61 @@
+using System;
+using System.IO;
+
+namespace NMaven.Core.Impl
+{
+ /// <summary>
+ /// Description of ProjectReferenceImpl.
+ /// </summary>
+ public class ProjectReferenceImpl : IProjectReference
+ {
+
+ private FileInfo csProjFile;
+
+ private string projectName;
+
+ private Guid projectGuid;
+
+ public ProjectReferenceImpl()
+ {
+ }
+
+ public FileInfo CsProjFile
+ {
+ get
+ {
+ return csProjFile;
+ }
+
+ set
+ {
+ csProjFile = value;
+ }
+ }
+
+ public string ProjectName
+ {
+ get
+ {
+ return projectName;
+ }
+
+ set
+ {
+ projectName = value;
+ }
+ }
+
+ public Guid ProjectGuid
+ {
+ get
+ {
+ return projectGuid;
+ }
+
+ set
+ {
+ projectGuid = value;
+ }
+ }
+ }
+}
Added: incubator/nmaven/branches/SI_IDE/assemblies/NMaven.Core/src/main/csharp/Core/Impl/ProjectRepositoryImpl.cs
URL: http://svn.apache.org/viewvc/incubator/nmaven/branches/SI_IDE/assemblies/NMaven.Core/src/main/csharp/Core/Impl/ProjectRepositoryImpl.cs?view=auto&rev=511157
==============================================================================
--- incubator/nmaven/branches/SI_IDE/assemblies/NMaven.Core/src/main/csharp/Core/Impl/ProjectRepositoryImpl.cs (added)
+++ incubator/nmaven/branches/SI_IDE/assemblies/NMaven.Core/src/main/csharp/Core/Impl/ProjectRepositoryImpl.cs Fri Feb 23 14:54:03 2007
@@ -0,0 +1,60 @@
+using System;
+using NMaven.Core;
+using NMaven.Model;
+using System.IO;
+using Microsoft.Build.BuildEngine;
+using System.Xml.Serialization;
+using System.Collections.Generic;
+using System.Reflection;
+
+namespace NMaven.Core.Impl
+{
+ /// <summary>
+ /// Description of ProjectRepositoryImpl.
+ /// </summary>
+ public class ProjectRepositoryImpl : IProjectRepository
+ {
+
+ private IProjectGenerator projectGenerator;
+
+ private string basedir = @"C:\Documents and Settings\shane\nmaven-apache\SI_IDE\assemblies";
+
+ public ProjectRepositoryImpl()
+ {
+ }
+
+ public List<IProjectObjectModel> getProjectObjectModelsFor(NMaven.Model.Model rootPom)
+ {
+ List<IProjectObjectModel> projectObjectModels = new List<IProjectObjectModel>();
+ if(rootPom.packaging.Equals("pom"))
+ {
+ foreach(String module in rootPom.modules)
+ {
+ NMaven.Model.Model model = createPomModelFor(basedir + @"\" + module + @"\pom.xml");
+ }
+ }
+ else
+ {
+ Dependency[] dependencies = rootPom.dependencies;
+ foreach(Dependency dependency in dependencies)
+ {
+
+ }
+ }
+ return projectObjectModels;
+
+ }
+
+ public void init(IProjectGenerator projectGenerator)
+ {
+ this.projectGenerator = projectGenerator;
+ }
+
+ private NMaven.Model.Model createPomModelFor(string fileName)
+ {
+ TextReader reader = new StreamReader(fileName);
+ XmlSerializer serializer = new XmlSerializer(typeof(NMaven.Model.Model));
+ return (NMaven.Model.Model) serializer.Deserialize(reader);
+ }
+ }
+}
Added: incubator/nmaven/branches/SI_IDE/assemblies/NMaven.Core/src/test/csharp/Core/Impl/NMavenContextImplTest.cs
URL: http://svn.apache.org/viewvc/incubator/nmaven/branches/SI_IDE/assemblies/NMaven.Core/src/test/csharp/Core/Impl/NMavenContextImplTest.cs?view=auto&rev=511157
==============================================================================
--- incubator/nmaven/branches/SI_IDE/assemblies/NMaven.Core/src/test/csharp/Core/Impl/NMavenContextImplTest.cs (added)
+++ incubator/nmaven/branches/SI_IDE/assemblies/NMaven.Core/src/test/csharp/Core/Impl/NMavenContextImplTest.cs Fri Feb 23 14:54:03 2007
@@ -0,0 +1,46 @@
+using NUnit.Framework;
+using System;
+using System.IO;
+using NMaven.Core.Impl;
+using NMaven.Model;
+using Microsoft.Build.BuildEngine;
+using System.Collections;
+using System.Collections.Generic;
+
+namespace NMaven.Core.Impl
+{
+ [TestFixture]
+ public class TestNMavenContextImplTest
+ {
+ [Test]
+ public void TestMethod()
+ {
+ IProjectGenerator projectGenerator = new ProjectGeneratorImpl();
+
+ NMaven.Model.Model model = projectGenerator.createPomModelFor(@"..\..\..\pom.xml");
+ Console.WriteLine(model.artifactId);
+
+ IProjectReference projectReference =
+ projectGenerator.generateProjectFor(model,
+ new DirectoryInfo(@"C:\Documents and Settings\shane\nmaven-apache\SI_IDE\assemblies\NMaven.Core\src\main\csharp\"),
+ model.artifactId + "T1", null);
+ List<IProjectReference> projectReferences = new List<IProjectReference>();
+ projectReferences.Add(projectReference);
+
+ IProjectReference testReference = projectGenerator.generateProjectFor(model,
+ new DirectoryInfo(@"C:\Documents and Settings\shane\nmaven-apache\SI_IDE\assemblies\NMaven.Core\src\test\csharp\"),
+ model.artifactId + "-Test1", projectReferences);
+ projectReferences.Add(testReference);
+
+
+ projectGenerator.generateSolutionFor(projectReferences);
+
+ }
+
+ [Test]
+ public void TestA()
+ {
+
+ }
+}
+}