protected override IAsyncResult BeginExecute(AsyncCodeActivityContext context, AsyncCallback callback, object state) { string configurationFile = ConfigurationFile.Get(context); int timeoutMinutes = TimeOutMinutes.Get(context); string xpoFile = XPOFile.Get(context); StringList layerCodes = LayerCodes.Get(context); string modelManifest = ModelManifestFile.Get(context); string modelName; string publisher; string layer; string layerCode; Helper.ExtractClientLayerModelInfo(configurationFile, layerCodes, modelManifest, out modelName, out publisher, out layer, out layerCode); var clientConfig = Helper.GetClientConfig(configurationFile); Client.AutoRun.AxaptaAutoRun autoRun = new Client.AutoRun.AxaptaAutoRun() { ExitWhenDone = true, LogFile = string.Format(@"{0}\ImportLog-{1}.xml", Environment.ExpandEnvironmentVariables(clientConfig.LogDirectory), Guid.NewGuid()) }; autoRun.Steps.Add(new Client.AutoRun.XpoImport() { File = xpoFile }); string autoRunFile = string.Format(@"{0}\AutoRun-ImportXPO-{1}.xml", Environment.GetEnvironmentVariable("temp"), Guid.NewGuid()); Client.AutoRun.AxaptaAutoRun.SerializeAutoRun(autoRun, autoRunFile); context.TrackBuildMessage(string.Format("Importing XPO {0} into model {1}", xpoFile, modelName)); Process process = Client.Client.StartCommand(new Client.Commands.AutoRun() { ConfigurationFile = configurationFile, Layer = layer, LayerCode = layerCode, Model = modelName, ModelPublisher = publisher, Filename = autoRunFile }); Func <int, int, Exception> processWaitDelegate = new Func <int, int, Exception>(CommandContext.WaitForProcess); context.UserState = new CommandContext { Delegate = processWaitDelegate, Process = process, AutoRun = autoRun, AutoRunFile = autoRunFile, LogFile = autoRun.LogFile }; return(processWaitDelegate.BeginInvoke(process.Id, timeoutMinutes, callback, state)); }
protected override IAsyncResult BeginExecute(AsyncCodeActivityContext context, AsyncCallback callback, object state) { int timeOutMinutes = TimeOutMinutes.Get(context); string clientExePath = ClientExecutablePath.Get(context); string configurationFile = ConfigurationFile.Get(context); context.TrackBuildMessage("Generating CIL."); Client.Commands.GenerateCIL compile = new Client.Commands.GenerateCIL() { Minimize = true, LazyClassLoading = true, LazyTableLoading = true }; if (!string.IsNullOrEmpty(configurationFile)) { compile.ConfigurationFile = configurationFile; } Process process = null; if (string.IsNullOrEmpty(clientExePath)) { process = Client.Client.StartCommand(compile); } else { process = Client.Client.StartCommand(clientExePath, compile); } var alternateBinDirectory = Helper.GetServerConfig(configurationFile).AlternateBinDirectory; Func <int, int, Exception> processWaitDelegate = new Func <int, int, Exception>(CommandContext.WaitForProcess); context.UserState = new CommandContext { Delegate = processWaitDelegate, Process = process, AutoRun = null, AutoRunFile = null, LogFile = string.Format(@"{0}\XppIL\Dynamics.Ax.Application.dll.log", Environment.ExpandEnvironmentVariables(alternateBinDirectory)) }; return(processWaitDelegate.BeginInvoke(process.Id, timeOutMinutes, callback, state)); }
protected override IAsyncResult BeginExecute(AsyncCodeActivityContext context, AsyncCallback callback, object state) { int timeOutMinutes = TimeOutMinutes.Get(context); AXBuild.Commands.Compile compile = new AXBuild.Commands.Compile() { Workers = Workers.Get(context), LogPath = Directory.CreateDirectory(Path.Combine(Path.GetTempPath(), Path.GetRandomFileName())).FullName }; string configurationFile = ConfigurationFile.Get(context); string serverBinPath = Helper.GetServerConfig(configurationFile).AlternateBinDirectory; if (string.IsNullOrEmpty(serverBinPath)) { throw new Exception("Could not determine server binaries path"); } string altBin = AlternateBinaryFolder.Get(context); if (string.IsNullOrEmpty(altBin)) { altBin = Helper.GetClientConfig(configurationFile).BinaryDirectory; } compile.Compiler = Path.Combine(serverBinPath, "Ax32Serv.exe"); compile.AOSInstance = Helper.GetServerNumber(configurationFile).ToString("D2"); compile.AltBinDir = altBin; context.TrackBuildMessage("Compiling application using AXBuild", BuildMessageImportance.Normal); Process process = AXBuild.AXBuild.StartCommand(serverBinPath, compile); Func <int, int, Exception> processWaitDelegate = new Func <int, int, Exception>(CommandContext.WaitForProcess); context.UserState = new CommandContext { Delegate = processWaitDelegate, Process = process, AutoRun = null, AutoRunFile = null, LogFile = Path.Combine(compile.LogPath, "AxCompileAll.html") }; return(processWaitDelegate.BeginInvoke(process.Id, timeOutMinutes, callback, state)); }
protected override IAsyncResult BeginExecute(AsyncCodeActivityContext context, AsyncCallback callback, object state) { bool updateXRef = UpdateCrossReference.Get(context); int timeOutMinutes = TimeOutMinutes.Get(context); string clientExePath = ClientExecutablePath.Get(context); string configurationFile = ConfigurationFile.Get(context); context.TrackBuildMessage(string.Format("Compiling application {0} cross-reference update.", updateXRef ? "with" : "without")); Client.Commands.Compile compile = new Client.Commands.Compile() { Minimize = true, LazyClassLoading = true, LazyTableLoading = true, UpdateCrossReference = updateXRef }; if (!string.IsNullOrEmpty(configurationFile)) { compile.ConfigurationFile = configurationFile; } StringList layerCodes = LayerCodes.Get(context); if (layerCodes != null) { string modelManifest = ModelManifestFile.Get(context); if (!string.IsNullOrEmpty(modelManifest)) { string model; string publisher; string layer; string layerCode; Helper.ExtractClientLayerModelInfo(configurationFile, layerCodes, modelManifest, out model, out publisher, out layer, out layerCode); compile.Model = model; compile.ModelPublisher = publisher; compile.Layer = layer; compile.LayerCode = layerCode; } } Process process = null; if (string.IsNullOrEmpty(clientExePath)) { process = Client.Client.StartCommand(compile); } else { process = Client.Client.StartCommand(clientExePath, compile); } var clientConfig = Helper.GetClientConfig(configurationFile); Func <int, int, Exception> processWaitDelegate = new Func <int, int, Exception>(CommandContext.WaitForProcess); context.UserState = new CommandContext { Delegate = processWaitDelegate, Process = process, AutoRun = null, AutoRunFile = null, LogFile = string.Format(@"{0}\{1}", Environment.ExpandEnvironmentVariables(clientConfig.LogDirectory), "AxCompileAll.html") }; return(processWaitDelegate.BeginInvoke(process.Id, timeOutMinutes, callback, state)); }
protected override IAsyncResult BeginExecute(AsyncCodeActivityContext context, AsyncCallback callback, object state) { string configurationFile = ConfigurationFile.Get(context); int timeoutMinutes = TimeOutMinutes.Get(context); string vsProjectsFolder = VSProjectsFolder.Get(context); StringList layerCodes = LayerCodes.Get(context); if (!Directory.Exists(vsProjectsFolder)) { context.TrackBuildMessage(string.Format("VS Projects folder {0} not found.", vsProjectsFolder)); // TODO Is there a better way with this? can we just return null or something? Func <int, int, Exception> bogusDelegate = new Func <int, int, Exception>(CommandContext.WaitForProcess); context.UserState = new CommandContext { Delegate = bogusDelegate, Process = null, AutoRun = null, AutoRunFile = null }; return(bogusDelegate.BeginInvoke(0, 0, callback, state)); } string modelName; string publisher; string layer; string layerCode; string modelManifest = ModelManifestFile.Get(context); Helper.ExtractClientLayerModelInfo(configurationFile, layerCodes, modelManifest, out modelName, out publisher, out layer, out layerCode); var clientConfig = Helper.GetClientConfig(configurationFile); Client.AutoRun.AxaptaAutoRun autoRun = new Client.AutoRun.AxaptaAutoRun() { ExitWhenDone = true, LogFile = string.Format(@"{0}\VSImportLog-{1}.xml", Environment.ExpandEnvironmentVariables(clientConfig.LogDirectory), Guid.NewGuid()) }; var filesToProcess = from filter in new[] { "*.csproj", "*.dynamicsproj", "*.vbproj" } select Directory.GetFiles(vsProjectsFolder, filter, SearchOption.AllDirectories); foreach (string filename in filesToProcess.SelectMany(f => f)) { autoRun.Steps.Add(new Client.AutoRun.Run() { Type = Client.AutoRun.RunType.@class, Name = "SysTreeNodeVSProject", Method = "importProject", Parameters = string.Format("@'{0}'", filename) }); } string autoRunFile = string.Format(@"{0}\AutoRun-VSImport-{1}.xml", Environment.GetEnvironmentVariable("temp"), Guid.NewGuid()); Client.AutoRun.AxaptaAutoRun.SerializeAutoRun(autoRun, autoRunFile); context.TrackBuildMessage(string.Format("Importing VS Projects from folder {0} into model {1}", vsProjectsFolder, modelName)); Process process = Client.Client.StartCommand(new Client.Commands.AutoRun() { ConfigurationFile = configurationFile, Layer = layer, LayerCode = layerCode, Model = modelName, ModelPublisher = publisher, Filename = autoRunFile }); Func <int, int, Exception> processWaitDelegate = new Func <int, int, Exception>(CommandContext.WaitForProcess); context.UserState = new CommandContext { Delegate = processWaitDelegate, Process = process, AutoRun = autoRun, AutoRunFile = autoRunFile, LogFile = autoRun.LogFile }; return(processWaitDelegate.BeginInvoke(process.Id, timeoutMinutes, callback, state)); }
protected override IAsyncResult BeginExecute(AsyncCodeActivityContext context, AsyncCallback callback, object state) { int timeoutMinutes = TimeOutMinutes.Get(context); string configurationFile = ConfigurationFile.Get(context); StringList layerCodes = LayerCodes.Get(context); string labelFilesFolder = LabelFilesFolder.Get(context); if (!Directory.Exists(labelFilesFolder)) { context.TrackBuildWarning(string.Format("Label file folder {0} not found.", labelFilesFolder)); // TODO Is there a better way with this? can we just return null or something? Func <int, int, Exception> bogusDelegate = new Func <int, int, Exception>(CommandContext.WaitForProcess); context.UserState = new CommandContext { Delegate = bogusDelegate, Process = null, AutoRun = null, AutoRunFile = null }; return(bogusDelegate.BeginInvoke(0, 0, callback, state)); } string modelName; string publisher; string layer; string layerCode; string modelManifest = ModelManifestFile.Get(context); Helper.ExtractClientLayerModelInfo(configurationFile, layerCodes, modelManifest, out modelName, out publisher, out layer, out layerCode); var clientConfig = Helper.GetClientConfig(configurationFile); Client.AutoRun.AxaptaAutoRun autoRun = new Client.AutoRun.AxaptaAutoRun() { ExitWhenDone = true, LogFile = string.Format(@"{0}\LabelFlushLog-{1}.xml", Environment.ExpandEnvironmentVariables(clientConfig.LogDirectory), Guid.NewGuid()) }; Client.Commands.ImportLabelFile importCommand = new Client.Commands.ImportLabelFile() { ConfigurationFile = configurationFile, Layer = layer, LayerCode = layerCode, Model = modelName, ModelPublisher = publisher }; foreach (string filename in Directory.GetFiles(labelFilesFolder, "*.ald")) { if (!IsEmptyLabelFile(filename)) { context.TrackBuildMessage(string.Format("Importing label file {0} into model {1} ({2})", filename, modelName, publisher)); importCommand.Filename = filename; Client.Client.ExecuteCommand(importCommand, timeoutMinutes); string labelFile = Path.GetFileNameWithoutExtension(filename).Substring(2, 3); string labelLanguage = Path.GetFileNameWithoutExtension(filename).Substring(5); autoRun.Steps.Add(new Client.AutoRun.Run() { Type = Client.AutoRun.RunType.@class, Name = "Global", Method = "info", Parameters = string.Format("strFmt(\"Flush label {0} language {1}: %1\", Label::flush(\"{0}\",\"{1}\"))", labelFile, labelLanguage) }); } } string autoRunFile = string.Format(@"{0}\AutoRun-LabelFlush-{1}.xml", Environment.GetEnvironmentVariable("temp"), Guid.NewGuid()); Client.AutoRun.AxaptaAutoRun.SerializeAutoRun(autoRun, autoRunFile); context.TrackBuildMessage(string.Format("Flushing imported label files")); Process process = Client.Client.StartCommand(new Client.Commands.AutoRun() { ConfigurationFile = configurationFile, Layer = layer, LayerCode = layerCode, Model = modelName, ModelPublisher = publisher, Filename = autoRunFile }); Func <int, int, Exception> processWaitDelegate = new Func <int, int, Exception>(CommandContext.WaitForProcess); context.UserState = new CommandContext { Delegate = processWaitDelegate, Process = process, AutoRun = autoRun, AutoRunFile = autoRunFile, LogFile = autoRun.LogFile }; return(processWaitDelegate.BeginInvoke(process.Id, timeoutMinutes, callback, state)); }
protected override void EndExecute(AsyncCodeActivityContext context, IAsyncResult result) { CommandContext userState = context.UserState as CommandContext; if (userState != null) { Func <int, int, Exception> processWaitDelegate = userState.Delegate; Exception processWaitException = processWaitDelegate.EndInvoke(result); if (processWaitException != null) { throw processWaitException; } Client.CILGenerationOutput output = null; try { output = Client.CILGenerationOutput.CreateFromFile(userState.LogFile); } catch (FileNotFoundException) { throw new Exception("CIL generation log could not be found"); } catch (Exception ex) { throw new Exception(string.Format("Error parsing CIL generation log: {0}", ex.Message)); } bool hasErrors = false; foreach (var item in output.Output) { string compileMessage; if (item.LineNumber > 0) { compileMessage = string.Format("Object {0} method {1}, line {2} : {3}", item.ElementName, item.MethodName, item.LineNumber, item.Message); } else { compileMessage = string.Format("Object {0} method {1} : {2}", item.ElementName, item.MethodName, item.Message); } switch (item.Severity) { // Compile Errors case 0: context.TrackBuildError(compileMessage); hasErrors = true; break; // Compile Warnings case 1: context.TrackBuildWarning(compileMessage); break; // "Other" case 4: default: context.TrackBuildMessage(item.Message); break; } } if (hasErrors) { throw new Exception("CIL error(s) found"); } } }