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/20 00:50:40 UTC

svn commit: r509398 - in /incubator/nmaven/branches/SI_IDE/assemblies/NMaven.Core: pom.xml src/main/csharp/Core/Impl/NMavenContextImpl.cs

Author: sisbell
Date: Mon Feb 19 16:50:39 2007
New Revision: 509398

URL: http://svn.apache.org/viewvc?view=rev&rev=509398
Log:
FEATURE: Now handles dynamically adding dependencies to the csproj file by parsing the cs class files and extracting dependencies.

Modified:
    incubator/nmaven/branches/SI_IDE/assemblies/NMaven.Core/pom.xml
    incubator/nmaven/branches/SI_IDE/assemblies/NMaven.Core/src/main/csharp/Core/Impl/NMavenContextImpl.cs

Modified: incubator/nmaven/branches/SI_IDE/assemblies/NMaven.Core/pom.xml
URL: http://svn.apache.org/viewvc/incubator/nmaven/branches/SI_IDE/assemblies/NMaven.Core/pom.xml?view=diff&rev=509398&r1=509397&r2=509398
==============================================================================
--- incubator/nmaven/branches/SI_IDE/assemblies/NMaven.Core/pom.xml (original)
+++ incubator/nmaven/branches/SI_IDE/assemblies/NMaven.Core/pom.xml Mon Feb 19 16:50:39 2007
@@ -1,4 +1,4 @@
-<project>
+<project xmlns="http://maven.apache.org/POM/4.0.0">>
   <modelVersion>4.0.0</modelVersion>
   <groupId>NMaven.Core</groupId>
   <artifactId>NMaven.Core</artifactId>

Modified: incubator/nmaven/branches/SI_IDE/assemblies/NMaven.Core/src/main/csharp/Core/Impl/NMavenContextImpl.cs
URL: http://svn.apache.org/viewvc/incubator/nmaven/branches/SI_IDE/assemblies/NMaven.Core/src/main/csharp/Core/Impl/NMavenContextImpl.cs?view=diff&rev=509398&r1=509397&r2=509398
==============================================================================
--- incubator/nmaven/branches/SI_IDE/assemblies/NMaven.Core/src/main/csharp/Core/Impl/NMavenContextImpl.cs (original)
+++ incubator/nmaven/branches/SI_IDE/assemblies/NMaven.Core/src/main/csharp/Core/Impl/NMavenContextImpl.cs Mon Feb 19 16:50:39 2007
@@ -4,6 +4,8 @@
 using NMaven.Model;
 using NMaven.Core;
 using Microsoft.Build.BuildEngine;
+using System.Collections.Generic;
+using System.Reflection;
 
 namespace NMaven.Core.Impl {
 
@@ -33,11 +35,13 @@
 			DirectoryInfo sourcedir = new DirectoryInfo(basedir + @"src\main\csharp");
             DirectoryInfo[] directoryInfos = rootDirectoryInfo.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(sourcedir.FullName.Length + 1));
                 	addFoldersToProject(project, folderGroup, di);
             	}           	
@@ -54,6 +58,8 @@
             	
             	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 = 
@@ -66,6 +72,59 @@
             }				
 		}
 		
+		private void addProjectDependencies(Project project, NMaven.Model.Model model, DirectoryInfo rootDirectoryInfo) 
+		{
+			
+			BuildItemGroup group = project.AddNewItemGroup();
+			group.AddNewItem("Reference", "System.Xml");
+			
+			foreach(Dependency dependency in model.dependencies) {
+				String repoPath = @localRepository + 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, true);
+			}
+			
+			DirectoryInfo sourcedir = new DirectoryInfo(basedir + @"src\main\csharp");
+            DirectoryInfo[] directoryInfos = rootDirectoryInfo.GetDirectories();
+            
+            ClassParser classParser = new ClassParser();
+            List<FileInfo> fileInfos = new List<FileInfo>();
+            addFileInfosFromSourceDirectories(rootDirectoryInfo, 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 rootDirectoryInfo, List<FileInfo> fileInfos ) 
+		{
+            DirectoryInfo[] directoryInfos = rootDirectoryInfo.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";
@@ -94,18 +153,11 @@
             
             project.AddNewImport(@"$(MSBuildBinPath)\Microsoft.CSharp.Targets", null);
 
-            DirectoryInfo rootDirectoryInfo = new DirectoryInfo(basedir + @"src\main\csharp");            
+            DirectoryInfo rootDirectoryInfo = new DirectoryInfo(basedir + @"src\main\csharp"); 
+            addProjectDependencies(project, model, rootDirectoryInfo);
             addFoldersToProject(project, null, rootDirectoryInfo);
             addClassFilesToProject(project, null, rootDirectoryInfo);
-            
-			BuildItemGroup group = project.AddNewItemGroup();
-			foreach(Dependency dependency in model.dependencies) {
-				String repoPath = @localRepository + 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, true);
-			}
-			
+            			
 			return project;
 			
 		}
@@ -118,6 +170,39 @@
 		
 		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;
+			}
 		
 		}
 	}