2012-12-10 13:49:20 -01:00
using System ;
2012-11-07 13:56:52 -01:00
using System.Collections.Generic ;
2014-08-18 17:47:55 +02:00
using System.IO ;
2014-08-19 12:51:07 +02:00
using System.Runtime.Remoting.Messaging ;
2014-08-18 17:47:55 +02:00
using System.Text ;
using System.Web ;
2012-12-10 13:49:20 -01:00
using Umbraco.Core.Auditing ;
2012-12-15 10:43:03 +05:00
using Umbraco.Core.Events ;
2014-08-18 17:47:55 +02:00
using Umbraco.Core.IO ;
using Umbraco.Core.Logging ;
2012-10-24 11:29:51 -02:00
using Umbraco.Core.Models ;
using Umbraco.Core.Persistence ;
2014-01-09 18:08:13 +11:00
using Umbraco.Core.Persistence.Repositories ;
2012-10-24 11:29:51 -02:00
using Umbraco.Core.Persistence.UnitOfWork ;
2012-11-12 07:40:11 -01:00
namespace Umbraco.Core.Services
2012-10-24 11:29:51 -02:00
{
2012-10-30 09:25:28 -01:00
/// <summary>
/// Represents the File Service, which is an easy access to operations involving <see cref="IFile"/> objects like Scripts, Stylesheets and Templates
/// </summary>
2012-10-24 11:29:51 -02:00
public class FileService : IFileService
{
2013-12-16 18:10:44 +11:00
private readonly RepositoryFactory _repositoryFactory ;
2012-12-14 12:59:47 -01:00
private readonly IUnitOfWorkProvider _fileUowProvider ;
private readonly IDatabaseUnitOfWorkProvider _dataUowProvider ;
2014-08-20 14:08:45 +02:00
private readonly IMacroService _macroService ;
2012-10-24 11:29:51 -02:00
2012-12-14 13:27:10 -01:00
public FileService ( )
: this ( new RepositoryFactory ( ) )
2013-12-16 18:10:44 +11:00
{ }
2012-12-14 13:27:10 -01:00
2012-12-14 08:22:42 +05:00
public FileService ( RepositoryFactory repositoryFactory )
2014-08-20 14:08:45 +02:00
: this ( new FileUnitOfWorkProvider ( ) , new PetaPocoUnitOfWorkProvider ( ) , repositoryFactory , new MacroService ( ) )
2012-10-24 11:29:51 -02:00
{
}
2014-08-20 14:08:45 +02:00
public FileService ( IUnitOfWorkProvider fileProvider , IDatabaseUnitOfWorkProvider dataProvider , RepositoryFactory repositoryFactory , IMacroService macroService )
2012-10-24 11:29:51 -02:00
{
2013-12-16 18:10:44 +11:00
_repositoryFactory = repositoryFactory ;
2014-08-20 14:08:45 +02:00
_macroService = macroService ;
2013-12-16 18:10:44 +11:00
_fileUowProvider = fileProvider ;
_dataUowProvider = dataProvider ;
2012-10-24 11:29:51 -02:00
}
/// <summary>
/// Gets a list of all <see cref="Stylesheet"/> objects
/// </summary>
/// <returns>An enumerable list of <see cref="Stylesheet"/> objects</returns>
public IEnumerable < Stylesheet > GetStylesheets ( params string [ ] names )
{
2013-10-29 09:24:05 -04:00
using ( var repository = _repositoryFactory . CreateStylesheetRepository ( _fileUowProvider . GetUnitOfWork ( ) , _dataUowProvider . GetUnitOfWork ( ) ) )
2012-12-14 12:59:47 -01:00
{
return repository . GetAll ( names ) ;
}
2012-10-24 11:29:51 -02:00
}
/// <summary>
/// Gets a <see cref="Stylesheet"/> object by its name
/// </summary>
/// <param name="name">Name of the stylesheet incl. extension</param>
/// <returns>A <see cref="Stylesheet"/> object</returns>
public Stylesheet GetStylesheetByName ( string name )
{
2013-10-29 09:24:05 -04:00
using ( var repository = _repositoryFactory . CreateStylesheetRepository ( _fileUowProvider . GetUnitOfWork ( ) , _dataUowProvider . GetUnitOfWork ( ) ) )
2012-12-14 12:59:47 -01:00
{
return repository . Get ( name ) ;
}
2012-10-24 11:29:51 -02:00
}
/// <summary>
/// Saves a <see cref="Stylesheet"/>
/// </summary>
/// <param name="stylesheet"><see cref="Stylesheet"/> to save</param>
2012-12-10 13:49:20 -01:00
/// <param name="userId"></param>
2013-01-25 08:58:21 -01:00
public void SaveStylesheet ( Stylesheet stylesheet , int userId = 0 )
2012-10-24 11:29:51 -02:00
{
2013-12-16 18:10:44 +11:00
if ( SavingStylesheet . IsRaisedEventCancelled ( new SaveEventArgs < Stylesheet > ( stylesheet ) , this ) )
return ;
var uow = _fileUowProvider . GetUnitOfWork ( ) ;
2013-10-29 09:24:05 -04:00
using ( var repository = _repositoryFactory . CreateStylesheetRepository ( uow , _dataUowProvider . GetUnitOfWork ( ) ) )
2013-12-16 18:10:44 +11:00
{
repository . AddOrUpdate ( stylesheet ) ;
uow . Commit ( ) ;
2012-12-15 21:04:17 +05:00
2013-12-16 18:10:44 +11:00
SavedStylesheet . RaiseEvent ( new SaveEventArgs < Stylesheet > ( stylesheet , false ) , this ) ;
}
2012-12-15 21:04:17 +05:00
2013-12-16 18:10:44 +11:00
Audit . Add ( AuditTypes . Save , string . Format ( "Save Stylesheet performed by user" ) , userId , - 1 ) ;
2012-10-24 11:29:51 -02:00
}
/// <summary>
/// Deletes a stylesheet by its name
/// </summary>
/// <param name="name">Name incl. extension of the Stylesheet to delete</param>
2012-12-10 13:49:20 -01:00
/// <param name="userId"></param>
2013-01-25 08:58:21 -01:00
public void DeleteStylesheet ( string name , int userId = 0 )
2012-10-24 11:29:51 -02:00
{
2012-12-14 12:59:47 -01:00
var uow = _fileUowProvider . GetUnitOfWork ( ) ;
2013-10-29 09:24:05 -04:00
using ( var repository = _repositoryFactory . CreateStylesheetRepository ( uow , _dataUowProvider . GetUnitOfWork ( ) ) )
2012-12-14 12:59:47 -01:00
{
var stylesheet = repository . Get ( name ) ;
2012-12-10 13:49:20 -01:00
2013-12-16 18:10:44 +11:00
if ( DeletingStylesheet . IsRaisedEventCancelled ( new DeleteEventArgs < Stylesheet > ( stylesheet ) , this ) )
return ;
2012-12-10 13:49:20 -01:00
2013-12-16 18:10:44 +11:00
repository . Delete ( stylesheet ) ;
uow . Commit ( ) ;
2012-12-10 13:49:20 -01:00
2013-12-16 18:10:44 +11:00
DeletedStylesheet . RaiseEvent ( new DeleteEventArgs < Stylesheet > ( stylesheet , false ) , this ) ;
2012-12-10 13:49:20 -01:00
2013-12-16 18:10:44 +11:00
Audit . Add ( AuditTypes . Delete , string . Format ( "Delete Stylesheet performed by user" ) , userId , - 1 ) ;
2012-12-10 13:49:20 -01:00
}
2012-10-24 11:29:51 -02:00
}
/// <summary>
/// Validates a <see cref="Stylesheet"/>
/// </summary>
/// <param name="stylesheet"><see cref="Stylesheet"/> to validate</param>
/// <returns>True if Stylesheet is valid, otherwise false</returns>
public bool ValidateStylesheet ( Stylesheet stylesheet )
{
return stylesheet . IsValid ( ) & & stylesheet . IsFileValidCss ( ) ;
}
/// <summary>
/// Gets a list of all <see cref="Script"/> objects
/// </summary>
/// <returns>An enumerable list of <see cref="Script"/> objects</returns>
public IEnumerable < Script > GetScripts ( params string [ ] names )
{
2012-12-14 12:59:47 -01:00
using ( var repository = _repositoryFactory . CreateScriptRepository ( _fileUowProvider . GetUnitOfWork ( ) ) )
{
return repository . GetAll ( names ) ;
}
2012-10-24 11:29:51 -02:00
}
/// <summary>
/// Gets a <see cref="Script"/> object by its name
/// </summary>
/// <param name="name">Name of the script incl. extension</param>
/// <returns>A <see cref="Script"/> object</returns>
public Script GetScriptByName ( string name )
{
2012-12-14 12:59:47 -01:00
using ( var repository = _repositoryFactory . CreateScriptRepository ( _fileUowProvider . GetUnitOfWork ( ) ) )
{
return repository . Get ( name ) ;
}
2012-10-24 11:29:51 -02:00
}
/// <summary>
/// Saves a <see cref="Script"/>
/// </summary>
/// <param name="script"><see cref="Script"/> to save</param>
2012-12-10 13:49:20 -01:00
/// <param name="userId"></param>
2013-01-25 08:58:21 -01:00
public void SaveScript ( Script script , int userId = 0 )
2012-10-24 11:29:51 -02:00
{
2013-12-16 18:10:44 +11:00
if ( SavingScript . IsRaisedEventCancelled ( new SaveEventArgs < Script > ( script ) , this ) )
return ;
var uow = _fileUowProvider . GetUnitOfWork ( ) ;
using ( var repository = _repositoryFactory . CreateScriptRepository ( uow ) )
{
repository . AddOrUpdate ( script ) ;
uow . Commit ( ) ;
SavedScript . RaiseEvent ( new SaveEventArgs < Script > ( script , false ) , this ) ;
}
Audit . Add ( AuditTypes . Save , string . Format ( "Save Script performed by user" ) , userId , - 1 ) ;
2012-10-24 11:29:51 -02:00
}
/// <summary>
/// Deletes a script by its name
/// </summary>
/// <param name="name">Name incl. extension of the Script to delete</param>
2012-12-10 13:49:20 -01:00
/// <param name="userId"></param>
2013-01-25 08:58:21 -01:00
public void DeleteScript ( string name , int userId = 0 )
2012-10-24 11:29:51 -02:00
{
2012-12-14 12:59:47 -01:00
var uow = _fileUowProvider . GetUnitOfWork ( ) ;
using ( var repository = _repositoryFactory . CreateScriptRepository ( uow ) )
{
var script = repository . Get ( name ) ;
2012-12-10 13:49:20 -01:00
2013-12-16 18:10:44 +11:00
if ( DeletingScript . IsRaisedEventCancelled ( new DeleteEventArgs < Script > ( script ) , this ) )
return ; ;
repository . Delete ( script ) ;
uow . Commit ( ) ;
2012-12-10 13:49:20 -01:00
2013-12-16 18:10:44 +11:00
DeletedScript . RaiseEvent ( new DeleteEventArgs < Script > ( script , false ) , this ) ;
2012-12-10 13:49:20 -01:00
2013-12-16 18:10:44 +11:00
Audit . Add ( AuditTypes . Delete , string . Format ( "Delete Script performed by user" ) , userId , - 1 ) ;
2012-12-10 13:49:20 -01:00
}
2012-10-24 11:29:51 -02:00
}
/// <summary>
/// Validates a <see cref="Script"/>
/// </summary>
/// <param name="script"><see cref="Script"/> to validate</param>
/// <returns>True if Script is valid, otherwise false</returns>
public bool ValidateScript ( Script script )
{
return script . IsValid ( ) ;
}
2014-01-09 18:08:13 +11:00
public void CreateScriptFolder ( string folderPath )
{
var uow = _fileUowProvider . GetUnitOfWork ( ) ;
using ( var repository = _repositoryFactory . CreateScriptRepository ( uow ) )
{
( ( ScriptRepository ) repository ) . AddFolder ( folderPath ) ;
uow . Commit ( ) ;
}
}
public void DeleteScriptFolder ( string folderPath )
{
var uow = _fileUowProvider . GetUnitOfWork ( ) ;
using ( var repository = _repositoryFactory . CreateScriptRepository ( uow ) )
{
( ( ScriptRepository ) repository ) . DeleteFolder ( folderPath ) ;
uow . Commit ( ) ;
}
}
2012-10-24 11:29:51 -02:00
/// <summary>
2012-11-11 12:20:14 -01:00
/// Gets a list of all <see cref="ITemplate"/> objects
2012-10-24 11:29:51 -02:00
/// </summary>
2012-11-11 12:20:14 -01:00
/// <returns>An enumerable list of <see cref="ITemplate"/> objects</returns>
public IEnumerable < ITemplate > GetTemplates ( params string [ ] aliases )
2012-10-24 11:29:51 -02:00
{
2012-12-14 12:59:47 -01:00
using ( var repository = _repositoryFactory . CreateTemplateRepository ( _dataUowProvider . GetUnitOfWork ( ) ) )
{
return repository . GetAll ( aliases ) ;
}
2012-10-24 11:29:51 -02:00
}
/// <summary>
2012-11-11 12:20:14 -01:00
/// Gets a <see cref="ITemplate"/> object by its alias
2012-10-24 11:29:51 -02:00
/// </summary>
/// <param name="alias">Alias of the template</param>
/// <returns>A <see cref="Template"/> object</returns>
2012-12-12 15:17:48 -01:00
public ITemplate GetTemplate ( string alias )
2012-10-24 11:29:51 -02:00
{
2012-12-14 12:59:47 -01:00
using ( var repository = _repositoryFactory . CreateTemplateRepository ( _dataUowProvider . GetUnitOfWork ( ) ) )
{
return repository . Get ( alias ) ;
2012-12-17 11:16:09 -01:00
}
2012-10-24 11:29:51 -02:00
}
2012-12-12 15:17:48 -01:00
/// <summary>
/// Gets a <see cref="ITemplate"/> object by its alias
/// </summary>
/// <param name="id">Id of the template</param>
/// <returns>A <see cref="ITemplate"/> object</returns>
public ITemplate GetTemplate ( int id )
{
2012-12-17 11:16:09 -01:00
using ( var repository = _repositoryFactory . CreateTemplateRepository ( _dataUowProvider . GetUnitOfWork ( ) ) )
{
return repository . Get ( id ) ;
2012-12-14 12:59:47 -01:00
}
2012-12-12 15:17:48 -01:00
}
2013-12-16 18:10:44 +11:00
/// <summary>
/// Returns a template as a template node which can be traversed (parent, children)
/// </summary>
/// <param name="alias"></param>
/// <returns></returns>
public TemplateNode GetTemplateNode ( string alias )
{
using ( var repository = _repositoryFactory . CreateTemplateRepository ( _dataUowProvider . GetUnitOfWork ( ) ) )
{
return repository . GetTemplateNode ( alias ) ;
}
}
/// <summary>
/// Given a template node in a tree, this will find the template node with the given alias if it is found in the hierarchy, otherwise null
/// </summary>
/// <param name="anyNode"></param>
/// <param name="alias"></param>
/// <returns></returns>
public TemplateNode FindTemplateInTree ( TemplateNode anyNode , string alias )
{
using ( var repository = _repositoryFactory . CreateTemplateRepository ( _dataUowProvider . GetUnitOfWork ( ) ) )
{
return repository . FindTemplateInTree ( anyNode , alias ) ;
}
}
2012-10-24 11:29:51 -02:00
/// <summary>
/// Saves a <see cref="Template"/>
/// </summary>
/// <param name="template"><see cref="Template"/> to save</param>
2012-12-10 13:49:20 -01:00
/// <param name="userId"></param>
2013-01-25 08:58:21 -01:00
public void SaveTemplate ( ITemplate template , int userId = 0 )
2012-10-24 11:29:51 -02:00
{
2013-12-16 18:10:44 +11:00
if ( SavingTemplate . IsRaisedEventCancelled ( new SaveEventArgs < ITemplate > ( template ) , this ) )
return ;
var uow = _dataUowProvider . GetUnitOfWork ( ) ;
using ( var repository = _repositoryFactory . CreateTemplateRepository ( uow ) )
{
repository . AddOrUpdate ( template ) ;
uow . Commit ( ) ;
SavedTemplate . RaiseEvent ( new SaveEventArgs < ITemplate > ( template , false ) , this ) ;
}
Audit . Add ( AuditTypes . Save , string . Format ( "Save Template performed by user" ) , userId , template . Id ) ;
2012-10-24 11:29:51 -02:00
}
2013-03-20 20:31:44 -01:00
/// <summary>
/// Saves a collection of <see cref="Template"/> objects
/// </summary>
/// <param name="templates">List of <see cref="Template"/> to save</param>
/// <param name="userId">Optional id of the user</param>
public void SaveTemplate ( IEnumerable < ITemplate > templates , int userId = 0 )
{
if ( SavingTemplate . IsRaisedEventCancelled ( new SaveEventArgs < ITemplate > ( templates ) , this ) )
return ;
var uow = _dataUowProvider . GetUnitOfWork ( ) ;
using ( var repository = _repositoryFactory . CreateTemplateRepository ( uow ) )
{
foreach ( var template in templates )
{
repository . AddOrUpdate ( template ) ;
}
uow . Commit ( ) ;
SavedTemplate . RaiseEvent ( new SaveEventArgs < ITemplate > ( templates , false ) , this ) ;
}
Audit . Add ( AuditTypes . Save , string . Format ( "Save Template performed by user" ) , userId , - 1 ) ;
}
2012-10-24 11:29:51 -02:00
/// <summary>
/// Deletes a template by its alias
/// </summary>
2012-11-11 12:20:14 -01:00
/// <param name="alias">Alias of the <see cref="ITemplate"/> to delete</param>
2012-12-10 13:49:20 -01:00
/// <param name="userId"></param>
2013-01-25 08:58:21 -01:00
public void DeleteTemplate ( string alias , int userId = 0 )
2012-10-24 11:29:51 -02:00
{
2012-12-14 12:59:47 -01:00
var uow = _dataUowProvider . GetUnitOfWork ( ) ;
using ( var repository = _repositoryFactory . CreateTemplateRepository ( uow ) )
{
var template = repository . Get ( alias ) ;
2012-12-10 13:49:20 -01:00
2013-12-16 18:10:44 +11:00
if ( DeletingTemplate . IsRaisedEventCancelled ( new DeleteEventArgs < ITemplate > ( template ) , this ) )
return ;
2012-12-10 13:49:20 -01:00
2013-12-16 18:10:44 +11:00
repository . Delete ( template ) ;
uow . Commit ( ) ;
2012-12-10 13:49:20 -01:00
2013-12-16 18:10:44 +11:00
DeletedTemplate . RaiseEvent ( new DeleteEventArgs < ITemplate > ( template , false ) , this ) ;
2012-12-10 13:49:20 -01:00
2013-12-16 18:10:44 +11:00
Audit . Add ( AuditTypes . Delete , string . Format ( "Delete Template performed by user" ) , userId , template . Id ) ;
2012-12-10 13:49:20 -01:00
}
2012-10-24 11:29:51 -02:00
}
/// <summary>
2012-11-11 12:20:14 -01:00
/// Validates a <see cref="ITemplate"/>
2012-10-24 11:29:51 -02:00
/// </summary>
2012-11-11 12:20:14 -01:00
/// <param name="template"><see cref="ITemplate"/> to validate</param>
2012-10-24 11:29:51 -02:00
/// <returns>True if Script is valid, otherwise false</returns>
2012-11-11 12:20:14 -01:00
public bool ValidateTemplate ( ITemplate template )
2012-10-24 11:29:51 -02:00
{
return template . IsValid ( ) ;
}
2012-11-11 06:53:02 -01:00
2014-08-19 12:59:25 +02:00
// TODO: Before making this public: How to get feedback in the UI when cancelled
2014-08-19 12:51:07 +02:00
internal Attempt < PartialView > CreatePartialView ( PartialView partialView )
2014-08-18 17:47:55 +02:00
{
var partialViewsFileSystem = new PhysicalFileSystem ( partialView . BasePath ) ;
var relativeFilePath = partialView . ParentFolderName . EnsureEndsWith ( '/' ) + partialViewsFileSystem . GetRelativePath ( partialView . FileName ) ;
2014-08-19 12:51:07 +02:00
partialView . ReturnUrl = string . Format ( partialView . EditViewFile + "?file={0}" , HttpUtility . UrlEncode ( relativeFilePath ) ) ;
2014-08-18 17:47:55 +02:00
//return the link to edit the file if it already exists
if ( partialViewsFileSystem . FileExists ( partialView . Path ) )
2014-08-19 12:51:07 +02:00
return Attempt < PartialView > . Succeed ( partialView ) ;
2014-08-18 17:47:55 +02:00
if ( CreatingPartialView . IsRaisedEventCancelled ( new NewEventArgs < PartialView > ( partialView , true , partialView . Alias , - 1 ) , this ) )
{
2014-08-19 12:51:07 +02:00
// We have nowhere to return to, clear ReturnUrl
partialView . ReturnUrl = string . Empty ;
var failureMessage = string . Format ( "Creating Partial View {0} was cancelled by an event handler." , partialViewsFileSystem . GetFullPath ( partialView . FileName ) ) ;
LogHelper . Info < FileService > ( failureMessage ) ;
return Attempt < PartialView > . Fail ( partialView , new ArgumentException ( failureMessage ) ) ;
2014-08-18 17:47:55 +02:00
}
//create the file
var snippetPathAttempt = partialView . TryGetSnippetPath ( partialView . SnippetName ) ;
if ( snippetPathAttempt . Success = = false )
{
throw new InvalidOperationException ( "Could not load template with name " + partialView . SnippetName ) ;
}
using ( var snippetFile = new StreamReader ( partialViewsFileSystem . OpenFile ( snippetPathAttempt . Result ) ) )
{
var snippetContent = snippetFile . ReadToEnd ( ) . Trim ( ) ;
//strip the @inherits if it's there
snippetContent = partialView . HeaderMatch . Replace ( snippetContent , string . Empty ) ;
var content = string . Format ( "{0}{1}{2}" , partialView . CodeHeader , Environment . NewLine , snippetContent ) ;
2014-08-19 10:21:01 +02:00
using ( var stream = new MemoryStream ( Encoding . UTF8 . GetBytes ( content ) ) )
{
partialViewsFileSystem . AddFile ( partialView . Path , stream ) ;
}
2014-08-18 17:47:55 +02:00
}
if ( partialView . CreateMacro )
CreatePartialViewMacro ( partialView ) ;
2014-08-18 18:02:35 +02:00
2014-08-18 17:47:55 +02:00
CreatedPartialView . RaiseEvent ( new NewEventArgs < PartialView > ( partialView , false , partialView . Alias , - 1 ) , this ) ;
2014-08-19 12:51:07 +02:00
return Attempt < PartialView > . Succeed ( partialView ) ;
2014-08-18 17:47:55 +02:00
}
2014-08-20 14:08:45 +02:00
internal void CreatePartialViewMacro ( PartialView partialView )
2014-08-18 17:47:55 +02:00
{
var name = partialView . FileName . Substring ( 0 , ( partialView . FileName . LastIndexOf ( '.' ) + 1 ) )
. Trim ( '.' )
. SplitPascalCasing ( )
. ToFirstUpperInvariant ( ) ;
var macro = new Macro ( name , name ) { ScriptPath = partialView . BasePath + partialView . FileName } ;
2014-08-20 14:08:45 +02:00
_macroService . Save ( macro ) ;
2014-08-18 17:47:55 +02:00
}
2014-08-19 12:59:25 +02:00
// TODO: Before making this public: How to get feedback in the UI when cancelled
2014-08-18 17:47:55 +02:00
internal bool DeletePartialView ( PartialView partialView , int userId = 0 )
{
var partialViewsFileSystem = new PhysicalFileSystem ( partialView . BasePath ) ;
if ( DeletingPartialView . IsRaisedEventCancelled ( new DeleteEventArgs < PartialView > ( partialView ) , this ) )
{
2014-08-18 18:02:35 +02:00
LogHelper . Info < FileService > ( string . Format ( "Deleting Partial View {0} was cancelled by an event handler." , partialViewsFileSystem . GetFullPath ( partialView . FileName ) ) ) ;
2014-08-18 17:47:55 +02:00
return false ;
}
if ( partialViewsFileSystem . FileExists ( partialView . FileName ) )
{
partialViewsFileSystem . DeleteFile ( partialView . FileName ) ;
LogHelper . Info < FileService > ( string . Format ( "Partial View file {0} deleted by user {1}" , partialViewsFileSystem . GetFullPath ( partialView . FileName ) , userId ) ) ;
}
// TODO: does this ever even happen? I don't think folders show up in the tree currently.
// Leaving this here as it was in the original PartialViewTasks code - SJ
else if ( partialViewsFileSystem . DirectoryExists ( partialView . FileName ) )
{
partialViewsFileSystem . DeleteDirectory ( partialView . FileName , true ) ;
LogHelper . Info < FileService > ( string . Format ( "Partial View directory {0} deleted by user {1}" , partialViewsFileSystem . GetFullPath ( partialView . FileName ) , userId ) ) ;
}
DeletedPartialView . RaiseEvent ( new DeleteEventArgs < PartialView > ( partialView , false ) , this ) ;
return true ;
}
2014-08-19 12:51:07 +02:00
internal Attempt < PartialView > SavePartialView ( PartialView partialView , int userId = 0 )
{
if ( SavingPartialView . IsRaisedEventCancelled ( new SaveEventArgs < PartialView > ( partialView , true ) , this ) )
{
return Attempt < PartialView > . Fail ( new ArgumentException ( "Save was cancelled by an event handler " + partialView . FileName ) ) ;
}
//Directory check.. only allow files in script dir and below to be edited
if ( partialView . IsValid ( ) = = false )
{
return Attempt < PartialView > . Fail (
new ArgumentException ( string . Format ( "Illegal path: {0} or illegal file extension {1}" ,
partialView . Path ,
partialView . FileName . Substring ( partialView . FileName . LastIndexOf ( "." , StringComparison . Ordinal ) ) ) ) ) ;
}
//NOTE: I've left the below here just for informational purposes. If we save a file this way, then the UTF8
// BOM mucks everything up, strangely, if we use WriteAllText everything is ok!
// http://issues.umbraco.org/issue/U4-2118
//using (var sw = System.IO.File.CreateText(savePath))
//{
// sw.Write(val);
//}
System . IO . File . WriteAllText ( partialView . Path , partialView . Content , Encoding . UTF8 ) ;
//deletes the old file
if ( partialView . FileName ! = partialView . OldFileName )
{
// Create a new PartialView class so that we can set the FileName of the file that needs deleting
var deletePartial = partialView ;
deletePartial . FileName = partialView . OldFileName ;
DeletePartialView ( deletePartial , userId ) ;
}
SavedPartialView . RaiseEvent ( new SaveEventArgs < PartialView > ( partialView ) , this ) ;
return Attempt . Succeed ( partialView ) ;
}
2012-11-11 06:53:02 -01:00
//TODO Method to change name and/or alias of view/masterpage template
2012-12-10 13:49:20 -01:00
#region Event Handlers
/// <summary>
/// Occurs before Delete
2012-12-16 07:43:03 +05:00
/// </summary>
2013-12-16 18:10:44 +11:00
public static event TypedEventHandler < IFileService , DeleteEventArgs < ITemplate > > DeletingTemplate ;
/// <summary>
/// Occurs after Delete
/// </summary>
public static event TypedEventHandler < IFileService , DeleteEventArgs < ITemplate > > DeletedTemplate ;
/// <summary>
/// Occurs before Delete
/// </summary>
public static event TypedEventHandler < IFileService , DeleteEventArgs < Script > > DeletingScript ;
/// <summary>
/// Occurs after Delete
/// </summary>
public static event TypedEventHandler < IFileService , DeleteEventArgs < Script > > DeletedScript ;
/// <summary>
/// Occurs before Delete
/// </summary>
public static event TypedEventHandler < IFileService , DeleteEventArgs < Stylesheet > > DeletingStylesheet ;
2012-12-10 13:49:20 -01:00
/// <summary>
/// Occurs after Delete
/// </summary>
2013-12-16 18:10:44 +11:00
public static event TypedEventHandler < IFileService , DeleteEventArgs < Stylesheet > > DeletedStylesheet ;
2012-12-16 07:43:03 +05:00
2013-12-16 18:10:44 +11:00
/// <summary>
/// Occurs before Save
/// </summary>
public static event TypedEventHandler < IFileService , SaveEventArgs < ITemplate > > SavingTemplate ;
2012-12-16 07:43:03 +05:00
2013-12-16 18:10:44 +11:00
/// <summary>
/// Occurs after Save
/// </summary>
public static event TypedEventHandler < IFileService , SaveEventArgs < ITemplate > > SavedTemplate ;
2012-12-16 07:43:03 +05:00
2013-12-16 18:10:44 +11:00
/// <summary>
/// Occurs before Save
/// </summary>
public static event TypedEventHandler < IFileService , SaveEventArgs < Script > > SavingScript ;
2012-12-16 07:43:03 +05:00
2013-12-16 18:10:44 +11:00
/// <summary>
/// Occurs after Save
/// </summary>
public static event TypedEventHandler < IFileService , SaveEventArgs < Script > > SavedScript ;
2012-12-10 13:49:20 -01:00
/// <summary>
/// Occurs before Save
/// </summary>
2013-12-16 18:10:44 +11:00
public static event TypedEventHandler < IFileService , SaveEventArgs < Stylesheet > > SavingStylesheet ;
2012-12-10 13:49:20 -01:00
/// <summary>
/// Occurs after Save
/// </summary>
2013-12-16 18:10:44 +11:00
public static event TypedEventHandler < IFileService , SaveEventArgs < Stylesheet > > SavedStylesheet ;
2012-12-15 21:04:17 +05:00
2014-08-19 12:51:07 +02:00
/// <summary>
/// Occurs before Save
/// </summary>
internal static event TypedEventHandler < IFileService , SaveEventArgs < PartialView > > SavingPartialView ;
/// <summary>
/// Occurs after Save
/// </summary>
internal static event TypedEventHandler < IFileService , SaveEventArgs < PartialView > > SavedPartialView ;
2014-08-18 17:47:55 +02:00
/// <summary>
/// Occurs before Create
/// </summary>
internal static event TypedEventHandler < IFileService , NewEventArgs < PartialView > > CreatingPartialView ;
/// <summary>
/// Occurs after Create
/// </summary>
internal static event TypedEventHandler < IFileService , NewEventArgs < PartialView > > CreatedPartialView ;
/// <summary>
/// Occurs before Delete
/// </summary>
internal static event TypedEventHandler < IFileService , DeleteEventArgs < PartialView > > DeletingPartialView ;
/// <summary>
/// Occurs after Delete
/// </summary>
internal static event TypedEventHandler < IFileService , DeleteEventArgs < PartialView > > DeletedPartialView ;
2012-12-10 13:49:20 -01:00
#endregion
2014-08-19 12:51:07 +02:00
2012-10-24 11:29:51 -02:00
}
}