Browse Source

Fix FileNotFoundException if MVC T4 template processing fails.

Do not attempt to open the view or controller if the T4 text templating processing returns an error.
pull/28/head
Matt Ward 13 years ago
parent
commit
c67061996d
  1. 6
      src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/AddMvcControllerToProjectViewModel.cs
  2. 6
      src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/AddMvcViewToProjectViewModel.cs
  3. 3
      src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/IMvcControllerFileGenerator.cs
  4. 3
      src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/IMvcViewFileGenerator.cs
  5. 7
      src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/MvcFileGenerator.cs
  6. 19
      src/AddIns/BackendBindings/AspNet.Mvc/Test/Helpers/FakeMvcControllerFileGenerator.cs
  7. 7
      src/AddIns/BackendBindings/AspNet.Mvc/Test/Helpers/FakeMvcTextTemplateHost.cs
  8. 19
      src/AddIns/BackendBindings/AspNet.Mvc/Test/Helpers/FakeMvcViewFileGenerator.cs
  9. 18
      src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/AddMvcControllerToProjectViewModelTests.cs
  10. 17
      src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/AddMvcViewToProjectViewModelTests.cs
  11. 42
      src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/MvcControllerFileGeneratorTests.cs
  12. 42
      src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/MvcViewFileGeneratorTests.cs

6
src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/AddMvcControllerToProjectViewModel.cs

@ -106,15 +106,17 @@ namespace ICSharpCode.AspNet.Mvc
public void AddMvcController() public void AddMvcController()
{ {
GenerateMvcControllerFile(); if (GenerateMvcControllerFile()) {
AddMvcControllerFileToProject(); AddMvcControllerFileToProject();
}
IsClosed = true; IsClosed = true;
} }
void GenerateMvcControllerFile() bool GenerateMvcControllerFile()
{ {
ConfigureMvcControllerGenerator(); ConfigureMvcControllerGenerator();
controllerGenerator.GenerateFile(controllerFileName); controllerGenerator.GenerateFile(controllerFileName);
return !controllerGenerator.HasErrors;
} }
void ConfigureMvcControllerGenerator() void ConfigureMvcControllerGenerator()

6
src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/AddMvcViewToProjectViewModel.cs

@ -223,16 +223,18 @@ namespace ICSharpCode.AspNet.Mvc
public void AddMvcView() public void AddMvcView()
{ {
GenerateMvcViewFile(); if (GenerateMvcViewFile()) {
AddMvcViewFileToProject(); AddMvcViewFileToProject();
}
IsClosed = true; IsClosed = true;
} }
void GenerateMvcViewFile() bool GenerateMvcViewFile()
{ {
ConfigureMvcViewGenerator(); ConfigureMvcViewGenerator();
viewFileName.TemplateLanguage = GetTemplateLanguage(); viewFileName.TemplateLanguage = GetTemplateLanguage();
viewGenerator.GenerateFile(viewFileName); viewGenerator.GenerateFile(viewFileName);
return !viewGenerator.HasErrors;
} }
void ConfigureMvcViewGenerator() void ConfigureMvcViewGenerator()

3
src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/IMvcControllerFileGenerator.cs

@ -2,6 +2,7 @@
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt) // This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System; using System;
using System.CodeDom.Compiler;
using ICSharpCode.SharpDevelop.Project; using ICSharpCode.SharpDevelop.Project;
namespace ICSharpCode.AspNet.Mvc namespace ICSharpCode.AspNet.Mvc
@ -10,6 +11,8 @@ namespace ICSharpCode.AspNet.Mvc
{ {
IMvcProject Project { get; set; } IMvcProject Project { get; set; }
MvcControllerTextTemplate Template { get; set; } MvcControllerTextTemplate Template { get; set; }
CompilerErrorCollection Errors { get; }
bool HasErrors { get; }
void GenerateFile(MvcControllerFileName fileName); void GenerateFile(MvcControllerFileName fileName);
} }

3
src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/IMvcViewFileGenerator.cs

@ -2,6 +2,7 @@
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt) // This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System; using System;
using System.CodeDom.Compiler;
using ICSharpCode.SharpDevelop.Project; using ICSharpCode.SharpDevelop.Project;
namespace ICSharpCode.AspNet.Mvc namespace ICSharpCode.AspNet.Mvc
@ -15,6 +16,8 @@ namespace ICSharpCode.AspNet.Mvc
string MasterPageFile { get; set; } string MasterPageFile { get; set; }
string PrimaryContentPlaceHolderId { get; set; } string PrimaryContentPlaceHolderId { get; set; }
MvcViewTextTemplate Template { get; set; } MvcViewTextTemplate Template { get; set; }
CompilerErrorCollection Errors { get; }
bool HasErrors { get; }
void GenerateFile(MvcViewFileName fileName); void GenerateFile(MvcViewFileName fileName);
} }

7
src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/MvcFileGenerator.cs

@ -23,6 +23,11 @@ namespace ICSharpCode.AspNet.Mvc
public MvcTextTemplateLanguage TemplateLanguage { get; set; } public MvcTextTemplateLanguage TemplateLanguage { get; set; }
public IMvcProject Project { get; set; } public IMvcProject Project { get; set; }
public CompilerErrorCollection Errors { get; private set; }
public bool HasErrors {
get { return Errors.Count > 0; }
}
public void GenerateFile(MvcFileName fileName) public void GenerateFile(MvcFileName fileName)
{ {
@ -50,6 +55,8 @@ namespace ICSharpCode.AspNet.Mvc
string outputViewFileName = fileName.GetPath(); string outputViewFileName = fileName.GetPath();
host.ProcessTemplate(templateFileName, outputViewFileName); host.ProcessTemplate(templateFileName, outputViewFileName);
Errors = host.Errors;
if (host.Errors.Count > 0) { if (host.Errors.Count > 0) {
CompilerError error = host.Errors[0]; CompilerError error = host.Errors[0];
Console.WriteLine("ProcessTemplate error: " + error.ErrorText); Console.WriteLine("ProcessTemplate error: " + error.ErrorText);

19
src/AddIns/BackendBindings/AspNet.Mvc/Test/Helpers/FakeMvcControllerFileGenerator.cs

@ -2,6 +2,7 @@
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt) // This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System; using System;
using System.CodeDom.Compiler;
using ICSharpCode.AspNet.Mvc; using ICSharpCode.AspNet.Mvc;
using ICSharpCode.SharpDevelop.Project; using ICSharpCode.SharpDevelop.Project;
@ -9,6 +10,11 @@ namespace AspNet.Mvc.Tests.Helpers
{ {
public class FakeMvcControllerFileGenerator : IMvcControllerFileGenerator public class FakeMvcControllerFileGenerator : IMvcControllerFileGenerator
{ {
public FakeMvcControllerFileGenerator()
{
this.Errors = new CompilerErrorCollection();
}
public IMvcProject Project { get; set; } public IMvcProject Project { get; set; }
public MvcControllerTextTemplate Template { get; set; } public MvcControllerTextTemplate Template { get; set; }
@ -20,5 +26,18 @@ namespace AspNet.Mvc.Tests.Helpers
FileNamePassedToGenerateController = fileName; FileNamePassedToGenerateController = fileName;
IsGenerateFileCalled = true; IsGenerateFileCalled = true;
} }
public CompilerErrorCollection Errors { get; set; }
public CompilerError AddCompilerError()
{
var error = new CompilerError();
Errors.Add(error);
return error;
}
public bool HasErrors {
get { return Errors.Count > 0; }
}
} }
} }

7
src/AddIns/BackendBindings/AspNet.Mvc/Test/Helpers/FakeMvcTextTemplateHost.cs

@ -45,5 +45,12 @@ namespace AspNet.Mvc.Tests.Helpers
public string PrimaryContentPlaceHolderID { get; set; } public string PrimaryContentPlaceHolderID { get; set; }
public CompilerErrorCollection Errors { get; set; } public CompilerErrorCollection Errors { get; set; }
public CompilerError AddCompilerError()
{
var error = new CompilerError();
Errors.Add(error);
return error;
}
} }
} }

19
src/AddIns/BackendBindings/AspNet.Mvc/Test/Helpers/FakeMvcViewFileGenerator.cs

@ -2,6 +2,7 @@
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt) // This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System; using System;
using System.CodeDom.Compiler;
using ICSharpCode.AspNet.Mvc; using ICSharpCode.AspNet.Mvc;
using ICSharpCode.SharpDevelop.Project; using ICSharpCode.SharpDevelop.Project;
@ -9,6 +10,11 @@ namespace AspNet.Mvc.Tests.Helpers
{ {
public class FakeMvcViewFileGenerator : IMvcViewFileGenerator public class FakeMvcViewFileGenerator : IMvcViewFileGenerator
{ {
public FakeMvcViewFileGenerator()
{
this.Errors = new CompilerErrorCollection();
}
public IMvcProject Project { get; set; } public IMvcProject Project { get; set; }
public string ModelClassName { get; set; } public string ModelClassName { get; set; }
public string ModelClassAssemblyLocation { get; set; } public string ModelClassAssemblyLocation { get; set; }
@ -25,5 +31,18 @@ namespace AspNet.Mvc.Tests.Helpers
FileNamePassedToGenerateFile = fileName; FileNamePassedToGenerateFile = fileName;
IsGenerateFileCalled = true; IsGenerateFileCalled = true;
} }
public CompilerErrorCollection Errors { get; set; }
public CompilerError AddCompilerError()
{
var error = new CompilerError();
Errors.Add(error);
return error;
}
public bool HasErrors {
get { return Errors.Count > 0; }
}
} }
} }

18
src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/AddMvcControllerToProjectViewModelTests.cs

@ -81,6 +81,11 @@ namespace AspNet.Mvc.Tests
viewModel.SelectedControllerTemplate = GetControllerTemplateFromViewModel("EmptyReadWrite"); viewModel.SelectedControllerTemplate = GetControllerTemplateFromViewModel("EmptyReadWrite");
} }
void AddCompilerErrorToControllerGenerator()
{
fakeControllerGenerator.AddCompilerError();
}
[Test] [Test]
public void AddMvcControllerCommand_ExecutedWhenControllerNameSpecified_MvcControllerIsGenerated() public void AddMvcControllerCommand_ExecutedWhenControllerNameSpecified_MvcControllerIsGenerated()
{ {
@ -279,5 +284,18 @@ namespace AspNet.Mvc.Tests
Assert.AreEqual(expectedFileName, fileName); Assert.AreEqual(expectedFileName, fileName);
} }
[Test]
public void AddMvcController_TemplateGenerationHasError_FileIsNotAddedToProject()
{
CreateViewModelWithCSharpProject();
viewModel.ControllerName = "Home";
AddCompilerErrorToControllerGenerator();
viewModel.AddMvcController();
string fileAddedToProject = fakeSelectedMvcControllerFolder.FileNamePassedToAddFile;
Assert.IsNull(fileAddedToProject);
}
} }
} }

17
src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/AddMvcViewToProjectViewModelTests.cs

@ -106,6 +106,11 @@ namespace AspNet.Mvc.Tests
return fakeProject.AddModelClassToProject(fullyQualifiedClassName); return fakeProject.AddModelClassToProject(fullyQualifiedClassName);
} }
void AddCompilerErrorToViewGenerator()
{
fakeViewGenerator.AddCompilerError();
}
[Test] [Test]
public void AddMvcViewCommand_ExecutedWhenViewNameSpecified_MvcViewIsGenerated() public void AddMvcViewCommand_ExecutedWhenViewNameSpecified_MvcViewIsGenerated()
{ {
@ -1421,5 +1426,17 @@ namespace AspNet.Mvc.Tests
Assert.AreEqual(String.Empty, assemblyLocation); Assert.AreEqual(String.Empty, assemblyLocation);
} }
[Test]
public void AddMvcView_TemplateGenerationHasError_FileIsNotAddedToProject()
{
CreateViewModel();
AddCompilerErrorToViewGenerator();
viewModel.AddMvcView();
string fileAddedToProject = fakeSelectedMvcViewFolder.FileNamePassedToAddFile;
Assert.IsNull(fileAddedToProject);
}
} }
} }

42
src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/MvcControllerFileGeneratorTests.cs

@ -2,6 +2,7 @@
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt) // This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System; using System;
using System.CodeDom.Compiler;
using AspNet.Mvc.Tests.Helpers; using AspNet.Mvc.Tests.Helpers;
using ICSharpCode.AspNet.Mvc; using ICSharpCode.AspNet.Mvc;
using ICSharpCode.SharpDevelop.Project; using ICSharpCode.SharpDevelop.Project;
@ -66,6 +67,11 @@ namespace AspNet.Mvc.Tests
}; };
} }
CompilerError AddCompilerErrorToTemplateHost()
{
return fakeHost.AddCompilerError();
}
[Test] [Test]
public void GenerateFile_CSharpControllerTemplate_MvcTextTemplateHostIsCreated() public void GenerateFile_CSharpControllerTemplate_MvcTextTemplateHostIsCreated()
{ {
@ -202,5 +208,41 @@ namespace AspNet.Mvc.Tests
Assert.AreEqual(expectedAppDomain, appDomain); Assert.AreEqual(expectedAppDomain, appDomain);
} }
[Test]
public void GenerateFile_TemplateProcessedWithCompilerError_ErrorsSavedByGenerator()
{
CreateGenerator();
ProjectPassedToGeneratorIsCSharpProject();
CompilerError error = AddCompilerErrorToTemplateHost();
GenerateFile();
Assert.AreEqual(1, generator.Errors.Count);
Assert.AreEqual(error, generator.Errors[0]);
}
[Test]
public void HasErrors_NoErrors_ReturnsFalse()
{
CreateGenerator();
GenerateFile();
bool result = generator.HasErrors;
Assert.IsFalse(result);
}
[Test]
public void HasErrors_OneError_ReturnsTrue()
{
CreateGenerator();
AddCompilerErrorToTemplateHost();
GenerateFile();
bool result = generator.HasErrors;
Assert.IsTrue(result);
}
} }
} }

42
src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/MvcViewFileGeneratorTests.cs

@ -2,6 +2,7 @@
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt) // This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System; using System;
using System.CodeDom.Compiler;
using AspNet.Mvc.Tests.Helpers; using AspNet.Mvc.Tests.Helpers;
using ICSharpCode.AspNet.Mvc; using ICSharpCode.AspNet.Mvc;
using ICSharpCode.SharpDevelop.Project; using ICSharpCode.SharpDevelop.Project;
@ -78,6 +79,11 @@ namespace AspNet.Mvc.Tests
}; };
} }
CompilerError AddCompilerErrorToTemplateHost()
{
return fakeHost.AddCompilerError();
}
[Test] [Test]
public void GenerateFile_CSharpEmptyViewTemplate_MvcTextTemplateHostIsCreated() public void GenerateFile_CSharpEmptyViewTemplate_MvcTextTemplateHostIsCreated()
{ {
@ -315,5 +321,41 @@ namespace AspNet.Mvc.Tests
Assert.AreEqual(String.Empty, assemblyLocation); Assert.AreEqual(String.Empty, assemblyLocation);
} }
[Test]
public void GenerateFile_TemplateProcessedWithCompilerError_ErrorsSavedByGenerator()
{
CreateGenerator();
ProjectPassedToGeneratorIsCSharpProject();
CompilerError error = AddCompilerErrorToTemplateHost();
GenerateFile();
Assert.AreEqual(1, generator.Errors.Count);
Assert.AreEqual(error, generator.Errors[0]);
}
[Test]
public void HasErrors_NoErrors_ReturnsFalse()
{
CreateGenerator();
GenerateFile();
bool result = generator.HasErrors;
Assert.IsFalse(result);
}
[Test]
public void HasErrors_OneError_ReturnsTrue()
{
CreateGenerator();
AddCompilerErrorToTemplateHost();
GenerateFile();
bool result = generator.HasErrors;
Assert.IsTrue(result);
}
} }
} }

Loading…
Cancel
Save