/*
Kooboo is a content management system based on ASP.NET MVC framework. Copyright 2009 Yardi Technology Limited.
This program is free software: you can redistribute it and/or modify it under the terms of the
GNU General Public License version 3 as published by the Free Software Foundation.
This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License along with this program.
If not, see http://www.kooboo.com/gpl3/.
*/
using System;
using System.IO;
using System.Data;
using System.Data.Common;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Configuration;
using Everest.Library;
using Everest.CmsServices.Models;
using Everest.Library.ExtensionMethod;
using Everest.Library.Data.Rule;
using Microsoft.Data.Extensions;
using Everest.CmsServices.Services;
namespace Everest.CmsServices.Extension.Module{
public class ModuleSqlFileRunner
{
const string ModuleDDLConnectionString = "EverestCms";
public void Run(string filePath)
{
string sql = string.Empty;
using (FileStream sqlFileStream = new FileStream(filePath, FileMode.Open, FileAccess.Read))
{
sql = sqlFileStream.ReadString();
}
if (StringExtensions.IsNullOrEmptyTrim(sql))
{
return;
}
//if (ConfigurationManager.ConnectionStrings[ModuleDDLConnectionString] == null)
//{
// throw new Exception(string.Format(Resources.InstallModule_ModuleDDLStringIsRequired, ModuleDDLConnectionString));
//}
DbProviderFactory dbProviderFactory = DbProviderFactories.GetFactory(ConfigurationManager.ConnectionStrings[ModuleDDLConnectionString].ProviderName);
var dbConnection = dbProviderFactory.CreateConnection();
dbConnection.ConnectionString = ConfigurationManager.ConnectionStrings[ModuleDDLConnectionString].ConnectionString;
var dbCommand = dbProviderFactory.CreateCommand();
dbCommand.Connection = dbConnection;
dbCommand.CommandText = sql;
using (dbCommand.Connection.CreateConnectionScope())
{
dbCommand.ExecuteNonQuery();
}
}
}
public class ModuleInstaller
{
public ModuleInstaller()
{
}
public string Install(ModuleInfo moduleInfo, string userName)
{
StringBuilder messageBuilder = new StringBuilder();
if (moduleInfo.Configuration.Installed == false)
{
string application = CmsGlobal.RootApplicationName;
IEverestCmsDataContext dataContext = EverestCmsEntities.GetDataContext();
aspnet_Applications app = dataContext.QueryApplication(application).First();
if (moduleInfo.HostInCms)
{
messageBuilder.AppendHtmlLine(CopyAssemblies(moduleInfo));
}
messageBuilder.AppendHtmlLine(ExecuteSql(moduleInfo));
messageBuilder.AppendHtmlLine(CreateSchemas(dataContext, application, moduleInfo, userName));
messageBuilder.AppendHtmlLine(CreateFolders(dataContext, application, moduleInfo));
//set installed
moduleInfo.Configuration.Installed = true;
moduleInfo.SaveConfiguration(moduleInfo.Configuration);
}
else
{
messageBuilder.AppendFormat(Resources.InstallModule_ModuleAlreadyInstalled, moduleInfo.ModuleName);
}
return messageBuilder.ToString();
}
private string CopyAssemblies(ModuleInfo moduleInfo)
{
string binPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Bin");
StringBuilder message = new StringBuilder();
//StringBuilder bathBuilder = new StringBuilder();
if (moduleInfo.Configuration.Assemblies != null)
{
foreach (var item in moduleInfo.Configuration.Assemblies)
{
string fileName = Path.GetFileName(item.Path);
string sourceFilePath = Path.Combine(moduleInfo.ModuleBaseDirectory, item.Path);
string targetFilePath = Path.Combine(binPath, fileName);
try
{
// bathBuilder.AppendHtmlLine(string.Format("copy {0} {1}", sourceFilePath, targetFilePath));
File.Copy(sourceFilePath, targetFilePath, true);
//todo: generate bath script
}
catch (Exception e)
{
message.AppendHtmlLine(string.Format(Resources.InstallModule_CopyAssemblyFailed, sourceFilePath, e.Message));
Everest.Library.HealthMonitor.HealthMonitoringLogging.LogError(e);
}
}
}
return message.ToString();
}
private string ExecuteSql(ModuleInfo moduleInfo)
{
ModuleSqlFileRunner runner = new ModuleSqlFileRunner();
StringBuilder errorMessage = new StringBuilder();
if (moduleInfo.Configuration.InstallSqlFiles != null)
{
foreach (var item in moduleInfo.Configuration.InstallSqlFiles)
{
string sourceFilePath = Path.Combine(moduleInfo.ModuleBaseDirectory, item.Path);
try
{
runner.Run(sourceFilePath);
}
catch (Exception e)
{
errorMessage.AppendHtmlLine(string.Format(Resources.InstallModule_RunSqlFileFailed, sourceFilePath, e.Message));
Everest.Library.HealthMonitor.HealthMonitoringLogging.LogError(e);
}
}
}
return errorMessage.ToString();
}
private string CreateSchemas(IEverestCmsDataContext dataContext, string application, ModuleInfo moduleInfo, string userName)
{
StringBuilder errorMessage = new StringBuilder();
var schemaService = UnityManager.Resolve<SchemaService>();
if (moduleInfo.Configuration.Schemas != null)
{
foreach (var item in moduleInfo.Configuration.Schemas)
{
if (!StringExtensions.IsNullOrEmptyTrim(item.Path))
{
//
dataContext.ObjectContext.AcceptAllChanges();
string schemaFile = Path.Combine(moduleInfo.ModuleBaseDirectory, item.Path);
try
{
Cms_Schema schema = ObjectExtensions.DeserializeFromXmlFile<Cms_Schema>(schemaFile);
//UUIDSchema
//schema.UUID = Guid.NewGuid();
//foreach (var column in schema.Cms_Column)
//{
// column.UUID = Guid.NewGuid();
//}
schema.aspnet_Applications = dataContext.QueryApplication(application).First();
schema.ModifiedDate = DateTime.Now;
schemaService.AddSchema(dataContext, schema, userName);
}
catch (RuleViolationException ruleViolationEx)
{
StringBuilder violationMessage = new StringBuilder();
foreach (var issue in ruleViolationEx.Issues)
{
violationMessage.AppendHtmlLine(issue.ErrorMessage);
}
errorMessage.AppendHtmlLine(string.Format(Resources.InstallModule_CreateSchemaFailed, schemaFile, violationMessage.ToString()));
Everest.Library.HealthMonitor.HealthMonitoringLogging.LogError(ruleViolationEx);
}
catch (Exception e)
{
errorMessage.AppendHtmlLine(string.Format(Resources.InstallModule_CreateSchemaFailed, schemaFile, e.Message));
Everest.Library.HealthMonitor.HealthMonitoringLogging.LogError(e);
}
}
}
}
return errorMessage.ToString();
}
private string CreateFolders(IEverestCmsDataContext dataContext, string application, ModuleInfo moduleInfo)
{
StringBuilder errorMessage = new StringBuilder();
FolderService folderService = UnityManager.Resolve<FolderService>();
var contentFolder = dataContext.QueryFolders(application, FolderType.Content).FirstOrDefault();
if (contentFolder != null)
{
//
dataContext.ObjectContext.AcceptAllChanges();
if (moduleInfo.Configuration.Folders != null)
{
CreateFolders(folderService, application, moduleInfo.Configuration.Folders, errorMessage, contentFolder);
}
}
return errorMessage.ToString();
}
private static void CreateFolders(FolderService folderService, string application, FolderInfo[] folders, StringBuilder errorMessage, Cms_Folder parentFolder)
{
foreach (var item in folders)
{
try
{
var folder = folderService.CreateFolder(parentFolder.UUID, item.FolderName, application, application, item.SchemaName);
if (item.Children != null && item.Children.Length > 0)
{
CreateFolders(folderService, application, item.Children, errorMessage, folder);
}
}
catch (RuleViolationException ruleViolationEx)
{
StringBuilder violationMessage = new StringBuilder();
foreach (var issue in ruleViolationEx.Issues)
{
violationMessage.AppendHtmlLine(issue.ErrorMessage);
}
errorMessage.AppendHtmlLine(string.Format(Resources.InstallModule_CreateFolderFailed, item.FolderName, violationMessage.ToString()));
Everest.Library.HealthMonitor.HealthMonitoringLogging.LogError(ruleViolationEx);
}
catch (Exception e)
{
errorMessage.AppendHtmlLine(string.Format(Resources.InstallModule_CreateFolderFailed, item.FolderName, e.Message));
Everest.Library.HealthMonitor.HealthMonitoringLogging.LogError(e);
}
}
}
}
}
|