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