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. 8
      src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/AddMvcControllerToProjectViewModel.cs
  2. 8
      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

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

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

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

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

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

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

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

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

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

@ -23,6 +23,11 @@ namespace ICSharpCode.AspNet.Mvc @@ -23,6 +23,11 @@ namespace ICSharpCode.AspNet.Mvc
public MvcTextTemplateLanguage TemplateLanguage { 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)
{
@ -50,6 +55,8 @@ namespace ICSharpCode.AspNet.Mvc @@ -50,6 +55,8 @@ namespace ICSharpCode.AspNet.Mvc
string outputViewFileName = fileName.GetPath();
host.ProcessTemplate(templateFileName, outputViewFileName);
Errors = host.Errors;
if (host.Errors.Count > 0) {
CompilerError error = host.Errors[0];
Console.WriteLine("ProcessTemplate error: " + error.ErrorText);

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

@ -2,6 +2,7 @@ @@ -2,6 +2,7 @@
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System;
using System.CodeDom.Compiler;
using ICSharpCode.AspNet.Mvc;
using ICSharpCode.SharpDevelop.Project;
@ -9,6 +10,11 @@ namespace AspNet.Mvc.Tests.Helpers @@ -9,6 +10,11 @@ namespace AspNet.Mvc.Tests.Helpers
{
public class FakeMvcControllerFileGenerator : IMvcControllerFileGenerator
{
public FakeMvcControllerFileGenerator()
{
this.Errors = new CompilerErrorCollection();
}
public IMvcProject Project { get; set; }
public MvcControllerTextTemplate Template { get; set; }
@ -20,5 +26,18 @@ namespace AspNet.Mvc.Tests.Helpers @@ -20,5 +26,18 @@ namespace AspNet.Mvc.Tests.Helpers
FileNamePassedToGenerateController = fileName;
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 @@ -45,5 +45,12 @@ namespace AspNet.Mvc.Tests.Helpers
public string PrimaryContentPlaceHolderID { 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 @@ @@ -2,6 +2,7 @@
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System;
using System.CodeDom.Compiler;
using ICSharpCode.AspNet.Mvc;
using ICSharpCode.SharpDevelop.Project;
@ -9,6 +10,11 @@ namespace AspNet.Mvc.Tests.Helpers @@ -9,6 +10,11 @@ namespace AspNet.Mvc.Tests.Helpers
{
public class FakeMvcViewFileGenerator : IMvcViewFileGenerator
{
public FakeMvcViewFileGenerator()
{
this.Errors = new CompilerErrorCollection();
}
public IMvcProject Project { get; set; }
public string ModelClassName { get; set; }
public string ModelClassAssemblyLocation { get; set; }
@ -25,5 +31,18 @@ namespace AspNet.Mvc.Tests.Helpers @@ -25,5 +31,18 @@ namespace AspNet.Mvc.Tests.Helpers
FileNamePassedToGenerateFile = fileName;
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 @@ -81,6 +81,11 @@ namespace AspNet.Mvc.Tests
viewModel.SelectedControllerTemplate = GetControllerTemplateFromViewModel("EmptyReadWrite");
}
void AddCompilerErrorToControllerGenerator()
{
fakeControllerGenerator.AddCompilerError();
}
[Test]
public void AddMvcControllerCommand_ExecutedWhenControllerNameSpecified_MvcControllerIsGenerated()
{
@ -279,5 +284,18 @@ namespace AspNet.Mvc.Tests @@ -279,5 +284,18 @@ namespace AspNet.Mvc.Tests
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 @@ -106,6 +106,11 @@ namespace AspNet.Mvc.Tests
return fakeProject.AddModelClassToProject(fullyQualifiedClassName);
}
void AddCompilerErrorToViewGenerator()
{
fakeViewGenerator.AddCompilerError();
}
[Test]
public void AddMvcViewCommand_ExecutedWhenViewNameSpecified_MvcViewIsGenerated()
{
@ -1421,5 +1426,17 @@ namespace AspNet.Mvc.Tests @@ -1421,5 +1426,17 @@ namespace AspNet.Mvc.Tests
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 @@ @@ -2,6 +2,7 @@
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System;
using System.CodeDom.Compiler;
using AspNet.Mvc.Tests.Helpers;
using ICSharpCode.AspNet.Mvc;
using ICSharpCode.SharpDevelop.Project;
@ -66,6 +67,11 @@ namespace AspNet.Mvc.Tests @@ -66,6 +67,11 @@ namespace AspNet.Mvc.Tests
};
}
CompilerError AddCompilerErrorToTemplateHost()
{
return fakeHost.AddCompilerError();
}
[Test]
public void GenerateFile_CSharpControllerTemplate_MvcTextTemplateHostIsCreated()
{
@ -202,5 +208,41 @@ namespace AspNet.Mvc.Tests @@ -202,5 +208,41 @@ namespace AspNet.Mvc.Tests
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 @@ @@ -2,6 +2,7 @@
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System;
using System.CodeDom.Compiler;
using AspNet.Mvc.Tests.Helpers;
using ICSharpCode.AspNet.Mvc;
using ICSharpCode.SharpDevelop.Project;
@ -78,6 +79,11 @@ namespace AspNet.Mvc.Tests @@ -78,6 +79,11 @@ namespace AspNet.Mvc.Tests
};
}
CompilerError AddCompilerErrorToTemplateHost()
{
return fakeHost.AddCompilerError();
}
[Test]
public void GenerateFile_CSharpEmptyViewTemplate_MvcTextTemplateHostIsCreated()
{
@ -315,5 +321,41 @@ namespace AspNet.Mvc.Tests @@ -315,5 +321,41 @@ namespace AspNet.Mvc.Tests
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