private void GenerateDataVariableClasse(StringBuilder assemblyCode, ExternalDataDefinition externalData, IProcessDefinition process)
        {
            if (!string.IsNullOrWhiteSpace(externalData.Expresion))
            {
                foreach (var connection in externalData.ExternalDataConfigurationConnectionContextList)
                {
                    var variableScripts = ExpressionService.PrepareScriptForMultipleDestinations(connection.Expresion, new object());

                    assemblyCode.AppendFormat(@"
        public class {0}_CalculatedVariable : ExternalDataReceiverBase<{2}Edit>
        {{
            public {0}_CalculatedVariable(string data)
            {{
                Data = data;
            }} 
            
            {1}
", connection.SystemName, GenerateGetFieldMappings(externalData, process), process.Name);

                    foreach (var variableContext in externalData.DataVariableList)
                    {
                        if (variableScripts.ContainsKey(variableContext.VariableSystemName))
                        {
                            var variableName = variableContext.VariableSystemName;

                            assemblyCode.AppendFormat(@"
            private bool _is{1}Calculated;
            private {0} _{1};
            public {0} {1}
            {{
                get
                {{
                    if(string.IsNullOrWhiteSpace(Data)) return default({0});
                    
                    if(!_is{1}Calculated)
                    {{
                        _{1} = {2};
                        _is{1}Calculated = true;
                    }}

                    return _{1};
                }}                        
            }}", this.GetLiteralNameFromType(variableContext.VariableDataType), variableName, variableScripts[variableContext.VariableSystemName]);
                        }
                    }

                    assemblyCode.AppendFormat(@"
        }}");
                }
            }
        }
        private string GenerateGetFieldMappings(ExternalDataDefinition externalData, IProcessDefinition process)
        {
            var assemblyCode = new StringBuilder();
            var expressionScripts = ExpressionService.PrepareScriptForMultipleDestinations(externalData.Expresion, new object());

            assemblyCode.AppendFormat(CultureInfo.InvariantCulture, @"
            protected override IEnumerable<FieldMapping> GetFieldMappings({0}Edit editObject, Cebos.Veyron.SharedTypes.Expressions.ExpressionContext context)
            {{
                var item = editObject; // This variable is used in expressions. Don't remove.
                var mappings = new List<FieldMapping>();
", process.Name);

            var resultFields = ExpressionService.GetResultFields(externalData.Expresion);
            var variableIndex = 0;

            foreach (var resultField in resultFields)
            {
                var mappingVariableName = AddExternalDataFieldMapping(assemblyCode, resultField, expressionScripts, ref variableIndex);
                assemblyCode.AppendFormat(@"
                mappings.Add({0});", mappingVariableName);
            }

            assemblyCode.AppendFormat(CultureInfo.InvariantCulture, @"

                return mappings;
            }}
");

            return assemblyCode.ToString();
        }
        private void GenerateExternalData(
            StringBuilder assemblyCode,
            IProcessDefinition process,
            ExternalDataDefinition externalData)
        {
            //Variable
            assemblyCode.AppendLine(@"
                dataVariables = new System.Collections.Generic.List<Cebos.Veyron.SharedTypes.DataVariableContext>();");

            foreach (var context in externalData.DataVariableList)
            {
                assemblyCode.AppendFormat(
                    @"
                dataVariables.Add(new Cebos.Veyron.SharedTypes.DataVariableContext({0},{1}, System.Guid.Parse(""{2}""),Cebos.Veyron.SharedTypes.DataVariablesType.{3}));",
                          context.VariableName.ToLiteral(),
                          context.VariableSystemName.ToLiteral(),
                          context.Guid,
                          context.VariableDataType);
            }

            assemblyCode.AppendLine(@"
                externalDataConfigurationConnectionContextList = new System.Collections.Generic.List<Cebos.Veyron.SharedTypes.ExternalDataConfigurationConnectionContext>();
");

            foreach (var context in externalData.ExternalDataConfigurationConnectionContextList)
            {
                GenerateComputerConnectionList(assemblyCode, context.ComputerConnectionList);

                assemblyCode.AppendFormat(
                    @"
                externalDataConfigurationConnectionContextList.Add(new Cebos.Veyron.SharedTypes.ExternalDataConfigurationConnectionContext(
                                                                    {0},
                                                                    {15},
                                                                    {1}, 
                                                                    {2},
                                                                    Cebos.Veyron.SharedTypes.SerialPortParity.{3},
                                                                    {4},
                                                                    {5},
                                                                    {6},
                                                                    Cebos.Veyron.SharedTypes.FlowControl.{7},
                                                                    {8},
                                                                    {9},
                                                                    Cebos.Veyron.SharedTypes.ConnectionType.{10},
                                                                    Cebos.Veyron.SharedTypes.StopBits.{11},                                                                     
                                                                    computerConnectionContextList, 
                                                                    {12},
                                                                    {13},
                                                                    {14},
                                                                    string.Empty));",
                            context.Name.ToLiteral(),
                            context.PortName.ToLiteral(),
                            context.BaudRate.ToLiteral(),
                            context.Parity,
                            context.Dtr.ToLiteral(),
                            context.FlowControlHighSignal.ToString(CultureInfo.InvariantCulture),
                            context.ParityErrorChecking.ToLiteral(),
                            context.FlowControl,
                            context.Rts.ToLiteral(),
                            context.DataBits.ToLiteral(),
                            context.ConnectionType,
                            context.StopBits,
                            string.IsNullOrWhiteSpace(context.Vid) ? "string.Empty" : context.Vid.ToLiteral(),
                            string.IsNullOrWhiteSpace(context.Pid) ? "string.Empty" : context.Pid.ToLiteral(),
                            string.IsNullOrWhiteSpace(context.ParentIdPrefix) ? "string.Empty" : context.ParentIdPrefix.ToLiteral(),
                            context.SystemName.ToLiteral());
            }


            assemblyCode.AppendFormat(@"
                _externalDataList.Add(new Cebos.Veyron.SharedTypes.ExternalDataDefinition({0}, dataVariables, externalDataConfigurationConnectionContextList,{1}));", externalData.ExternalDataConnectionName.ToLiteral(), "ex".ToLiteral());
        }