using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text.RegularExpressions;
using Umbraco.Core.Events;
using Umbraco.Core.IO;
using Umbraco.Core.Logging;
using Umbraco.Core.Models;
using Umbraco.Core.Persistence.Repositories;
using Umbraco.Core.Persistence.Repositories.Implement;
using Umbraco.Core.Scoping;
namespace Umbraco.Core.Services.Implement
{
///
/// Represents the File Service, which is an easy access to operations involving objects like Scripts, Stylesheets and Templates
///
public class FileService : ScopeRepositoryService, IFileService
{
private readonly IStylesheetRepository _stylesheetRepository;
private readonly IScriptRepository _scriptRepository;
private readonly ITemplateRepository _templateRepository;
private readonly IPartialViewRepository _partialViewRepository;
private readonly IPartialViewMacroRepository _partialViewMacroRepository;
private readonly IAuditRepository _auditRepository;
private const string PartialViewHeader = "@inherits Umbraco.Web.Mvc.UmbracoViewPage";
private const string PartialViewMacroHeader = "@inherits Umbraco.Web.Macros.PartialViewMacroPage";
public FileService(IScopeProvider uowProvider, ILogger logger, IEventMessagesFactory eventMessagesFactory,
IStylesheetRepository stylesheetRepository, IScriptRepository scriptRepository, ITemplateRepository templateRepository,
IPartialViewRepository partialViewRepository, IPartialViewMacroRepository partialViewMacroRepository,
IAuditRepository auditRepository)
: base(uowProvider, logger, eventMessagesFactory)
{
_stylesheetRepository = stylesheetRepository;
_scriptRepository = scriptRepository;
_templateRepository = templateRepository;
_partialViewRepository = partialViewRepository;
_partialViewMacroRepository = partialViewMacroRepository;
_auditRepository = auditRepository;
}
#region Stylesheets
///
/// Gets a list of all objects
///
/// An enumerable list of objects
public IEnumerable GetStylesheets(params string[] names)
{
using (var scope = ScopeProvider.CreateScope(autoComplete: true))
{
return _stylesheetRepository.GetMany(names);
}
}
///
/// Gets a object by its name
///
/// Name of the stylesheet incl. extension
/// A object
public Stylesheet GetStylesheetByName(string name)
{
using (var scope = ScopeProvider.CreateScope(autoComplete: true))
{
return _stylesheetRepository.Get(name);
}
}
///
/// Saves a
///
/// to save
///
public void SaveStylesheet(Stylesheet stylesheet, int userId = Constants.Security.SuperUserId)
{
using (var scope = ScopeProvider.CreateScope())
{
var saveEventArgs = new SaveEventArgs(stylesheet);
if (scope.Events.DispatchCancelable(SavingStylesheet, this, saveEventArgs))
{
scope.Complete();
return;
}
_stylesheetRepository.Save(stylesheet);
saveEventArgs.CanCancel = false;
scope.Events.Dispatch(SavedStylesheet, this, saveEventArgs);
Audit(AuditType.Save, userId, -1, ObjectTypes.GetName(UmbracoObjectTypes.Stylesheet));
scope.Complete();
}
}
///
/// Deletes a stylesheet by its name
///
/// Name incl. extension of the Stylesheet to delete
///
public void DeleteStylesheet(string path, int userId = Constants.Security.SuperUserId)
{
using (var scope = ScopeProvider.CreateScope())
{
var stylesheet = _stylesheetRepository.Get(path);
if (stylesheet == null)
{
scope.Complete();
return;
}
var deleteEventArgs = new DeleteEventArgs(stylesheet);
if (scope.Events.DispatchCancelable(DeletingStylesheet, this, deleteEventArgs))
{
scope.Complete();
return; // causes rollback // causes rollback
}
_stylesheetRepository.Delete(stylesheet);
deleteEventArgs.CanCancel = false;
scope.Events.Dispatch(DeletedStylesheet, this, deleteEventArgs);
Audit(AuditType.Delete, userId, -1, ObjectTypes.GetName(UmbracoObjectTypes.Stylesheet));
scope.Complete();
}
}
///
/// Validates a
///
/// to validate
/// True if Stylesheet is valid, otherwise false
public bool ValidateStylesheet(Stylesheet stylesheet)
{
using (var scope = ScopeProvider.CreateScope(autoComplete: true))
{
return _stylesheetRepository.ValidateStylesheet(stylesheet);
}
}
public void CreateStyleSheetFolder(string folderPath)
{
using (var scope = ScopeProvider.CreateScope())
{
((StylesheetRepository) _stylesheetRepository).AddFolder(folderPath);
scope.Complete();
}
}
public void DeleteStyleSheetFolder(string folderPath)
{
using (var scope = ScopeProvider.CreateScope())
{
((StylesheetRepository) _stylesheetRepository).DeleteFolder(folderPath);
scope.Complete();
}
}
public Stream GetStylesheetFileContentStream(string filepath)
{
using (var scope = ScopeProvider.CreateScope(autoComplete: true))
{
return _stylesheetRepository.GetFileContentStream(filepath);
}
}
public void SetStylesheetFileContent(string filepath, Stream content)
{
using (var scope = ScopeProvider.CreateScope())
{
_stylesheetRepository.SetFileContent(filepath, content);
scope.Complete();
}
}
public long GetStylesheetFileSize(string filepath)
{
using (var scope = ScopeProvider.CreateScope(autoComplete: true))
{
return _stylesheetRepository.GetFileSize(filepath);
}
}
#endregion
#region Scripts
///
/// Gets a list of all objects
///
/// An enumerable list of objects
public IEnumerable