public void UninstallPlugin(PluginAddress pluginAddress) { Plugin plugin = GetPlugin(pluginAddress); if (plugin != null) { using (TransactionScope transaction = new TransactionScope()) { repository.Remove(context.Site.ID, plugin.ID); PluginContainer pluginContainer = pluginEngine.GetPlugins(p => p.Tag != null && p.Tag is Plugin && ((Plugin)p.Tag).ID == plugin.ID).FirstOrDefault(); if (!System.IO.File.Exists(context.HttpContext.Server.MapPath(pluginContainer.VirtualPath))) { pluginEngine.RemovePlugin(pluginContainer); } plugin.Container = null; pluginContainer.Tag = null; pluginTemplateRegistry.Reload(pluginEngine); context.Routes.Reload(modules, this, pluginEngine); pluginStyleRegistry.Reload(pluginEngine); pluginScriptRegistry.Reload(pluginEngine); transaction.Complete(); } } }
public object ItemEditSave(PluginAddress pluginAddress, PluginEditInput pluginEditInput, bool isEditingCode) { if (isEditingCode && !string.IsNullOrEmpty(pluginEditInput.VirtualPath)) { pluginEditInput.VirtualPath.SaveFileText(pluginEditInput.Code, HttpContext); pluginEngine.ReloadPlugin(p => p.Tag == null && !(p.Tag is Plugin) && string.Compare(p.VirtualPath, pluginEditInput.VirtualPath, true) == 0, p => pluginEditInput.VirtualPath); return(EditNotInstalled(new PluginNotInstalledAddress(pluginEditInput.VirtualPath))); } ModelResult <Plugin> results = null; Plugin plugin = pluginService.GetPlugin(pluginAddress); if (isEditingCode && !string.IsNullOrEmpty(pluginEditInput.Code) && pluginEditInput.Code != plugin.GetFileText()) { results = pluginService.EditPlugin(pluginAddress, pluginEditInput, true); } else if (!isEditingCode) { results = pluginService.EditPlugin(pluginAddress, pluginEditInput, false); } if (results != null && !results.IsValid) { ViewData["ValidationState"] = results.ValidationState; } if (isEditingCode || ViewData.ContainsKey("ValidationState")) { return(ItemEdit(pluginAddress, pluginEditInput)); } return(Redirect(Url.Plugin(plugin))); }
public void SetPluginEnabled(PluginAddress pluginAddress, bool enabled) { Plugin plugin = GetPlugin(pluginAddress); if (plugin != null && plugin.Enabled != enabled) { using (TransactionScope transaction = new TransactionScope()) { repository.SetEnabled(context.Site.ID, plugin.ID, enabled); plugin = GetPlugin(pluginAddress); PluginContainer pluginContainer = pluginEngine.GetPlugins(p => p.Tag != null && p.Tag is Plugin && ((Plugin)p.Tag).ID == plugin.ID).FirstOrDefault(); plugin.Container = pluginContainer; pluginContainer.Tag = plugin; pluginTemplateRegistry.Reload(pluginEngine); context.Routes.Reload(modules, this, pluginEngine); pluginStyleRegistry.Reload(pluginEngine); pluginScriptRegistry.Reload(pluginEngine); transaction.Complete(); } } }
public ActionResult Reload(PluginAddress pluginAddress) { Plugin plugin = pluginService.GetPlugin(pluginAddress); if (plugin == null) { return(null); } pluginService.ReloadPlugin(pluginAddress); return(Redirect(Url.Plugin(plugin))); }
public OxiteViewModelItem <PluginEditInput> ItemEdit(PluginAddress pluginAddress, PluginEditInput pluginEditInput) { Plugin plugin = pluginService.GetPlugin(pluginAddress); if (plugin == null) { return(null); } OxiteViewModelItem <PluginEditInput> model = new OxiteViewModelItem <PluginEditInput>(pluginEditInput == null ? new PluginEditInput(plugin.GetFileText(), plugin.Enabled, plugin.ExtendedProperties) : new PluginEditInput(null, pluginEditInput.Code ?? plugin.GetFileText(), pluginEditInput.Enabled, pluginEditInput.PropertyValues)); model.AddModelItem(pluginEngine.GetPlugin(plugin)); return(model); }
public ActionResult Uninstall(PluginAddress pluginAddress, DialogSelection dialogSelection) { if (dialogSelection != null && dialogSelection.Equals(DialogButton.Cancel)) { return(new DialogSelectionResult(dialogSelection.ReturnUrl, true)); } if (dialogSelection == null) { return(this.Dialog("Are you sure you want to uninstall this plugin?", DialogFormat.Question, DialogButton.Yes, new DialogButton("cancel", "No", true))); } pluginService.UninstallPlugin(pluginAddress); return(Redirect(dialogSelection.ReturnUrl)); }
public ActionResult SetEnabled(PluginAddress pluginAddress, bool enabled, string returnUrl, DialogSelection dialogSelection) { if (dialogSelection != null && dialogSelection.Equals(DialogButton.Cancel)) { return(new DialogSelectionResult(dialogSelection.ReturnUrl, true)); } Plugin plugin = pluginService.GetPlugin(pluginAddress); if (plugin == null) { return(null); } plugin.FillContainer(pluginEngine); if (dialogSelection == null && !plugin.Enabled && !plugin.Container.IsValid) { return(this.Dialog("You can not enable a plugin that does not have all its required settings filled in. What would you like to do next?", DialogFormat.Info, new DialogButton("yes", "Edit settings", true), new DialogButton("cancel", "Cancel", false))); } if (dialogSelection != null) { return new DialogSelectionResult(Url.PluginEdit(plugin)) { IsClientRedirect = true } } ; if (plugin.Container.IsValid || (!plugin.Container.IsValid && !enabled)) { pluginService.SetPluginEnabled(pluginAddress, enabled); } return(Redirect(returnUrl)); }
public void ReloadPlugin(PluginAddress pluginAddress) { Plugin plugin = GetPlugin(pluginAddress); if (plugin != null) { PluginContainer pluginContainer = pluginEngine.ReloadPlugin(p => p.Tag != null && p.Tag is Plugin && ((Plugin)p.Tag).ID == plugin.ID, p => plugin.VirtualPath); if (pluginContainer.IsLoaded) { plugin = repository.Save(plugin.ApplyProperties(pluginContainer.GetPropertiesUsingDefaultValues())); pluginContainer.ApplyProperties(plugin.ExtendedProperties); } plugin.Container = pluginContainer; pluginContainer.Tag = plugin; pluginTemplateRegistry.Reload(pluginEngine); context.Routes.Reload(modules, this, pluginEngine); pluginStyleRegistry.Reload(pluginEngine); pluginScriptRegistry.Reload(pluginEngine); } }
public Plugin GetPlugin(PluginAddress pluginAddress) { return(repository.GetPlugin(context.Site.ID, pluginAddress.PluginID)); }
public ModelResult <Plugin> EditPlugin(PluginAddress pluginAddress, PluginEditInput pluginEditInput, bool hasCodeChanges) { Plugin originalPlugin = GetPlugin(pluginAddress); bool enabled = originalPlugin.Enabled; bool newlyEnabled = false; Plugin newPlugin; PluginContainer pluginContainer; ValidationStateDictionary validationState; if (!hasCodeChanges) { validationState = validatePluginPropertyValues(originalPlugin.FillContainer(pluginEngine), pluginEditInput.PropertyValues); pluginContainer = pluginEngine.GetPlugin(originalPlugin); pluginContainer.IsValid = validationState.IsValid; newlyEnabled = !enabled && validationState.IsValid; newPlugin = originalPlugin.Apply(pluginEditInput, newlyEnabled ? (bool?)true : null); if (!validationState.IsValid) { return(new ModelResult <Plugin>(newPlugin, validationState)); } } else { validationState = new ValidationStateDictionary(); originalPlugin.SaveFileText(pluginEditInput.Code); pluginContainer = pluginEngine.ReloadPlugin(p => p.Tag != null && p.Tag is Plugin && ((Plugin)p.Tag).ID == originalPlugin.ID, p => originalPlugin.VirtualPath); if (pluginContainer.IsLoaded) { newPlugin = originalPlugin.ApplyNew(pluginEditInput, pluginContainer.GetProperties()); } else { newPlugin = originalPlugin.Apply(pluginEditInput, null); } } newPlugin = repository.Save(newPlugin); newPlugin.Container = pluginContainer; pluginContainer.Tag = newPlugin; if (!hasCodeChanges) { pluginContainer.ApplyProperties(newPlugin.ExtendedProperties); if (newlyEnabled) { pluginTemplateRegistry.Reload(pluginEngine); context.Routes.Reload(modules, this, pluginEngine); pluginStyleRegistry.Reload(pluginEngine); pluginScriptRegistry.Reload(pluginEngine); } else { pluginTemplateRegistry.UpdatePlugin(newPlugin); pluginStyleRegistry.UpdatePlugin(newPlugin); pluginScriptRegistry.UpdatePlugin(newPlugin); } } else { //TODO: (erikpo) Instead fire off a module event saying a plugin was edited and then Oxite.Blogs, Oxite.CMS and Oxite.Comments can subscribe to those events and invalidate cache by their type on their own. //if (pluginContainer.HasMethod("ProcessDisplayOfPost")) // cache.Invalidate<Post>(); //else if (pluginContainer.HasMethod("ProcessDisplayOfPage")) // cache.Invalidate<Page>(); //else if (pluginContainer.HasMethod("ProcessDisplayOfComment")) // cache.Invalidate<Comment>(); pluginTemplateRegistry.Reload(pluginEngine); context.Routes.Reload(modules, this, pluginEngine); pluginStyleRegistry.Reload(pluginEngine); pluginScriptRegistry.Reload(pluginEngine); } return(new ModelResult <Plugin>(newPlugin, validationState)); }