Esempio n. 1
0
        private ReferenceJoinFieldDefinition GetJoinField(FieldEdit fieldInfo)
        {
            var columnType = fieldInfo.FieldType.ColumnType;
            var publishedProcess = fieldInfo.GetParent<ProcessEdit>();

            if (columnType == ColumnTypes.Reference || columnType == ColumnTypes.MultiReference)
            {
                var crStep = (CrossRefRequiredStepEdit)fieldInfo.StepList.FirstOrDefault(s => s is CrossRefRequiredStepEdit);

                if (crStep != null)
                {
                    if (crStep.AllowMultiple)
                        columnType = ColumnTypes.MultiReference;

                    if (!crStep.CrossRefProcessId.HasValue)
                        throw new InvalidReferenceFieldExpcetion(publishedProcess.SystemName, fieldInfo.SystemName, "Cross reference process is null.");

                    var referencedProcess = Cache.GetProcessInfo(crStep.CrossRefProcessId.Value);

                    var joinField = new ReferenceJoinFieldDefinition
                    {
                        Name = fieldInfo.Name,
                        SystemName = fieldInfo.SystemName,
                        ColumnType = columnType,
                        DefinedIn = GetProcessDefinition(publishedProcess),
                        ReferencedProcess = GetProcessDefinition(referencedProcess)
                    };

                    if (columnType == ColumnTypes.MultiReference && !string.IsNullOrEmpty(crStep.LinkFieldSystemName))
                    {
                        var referenceField = GetJoinField(referencedProcess.SystemName, crStep.LinkFieldSystemName);

                        if (referenceField.ColumnType != ColumnTypes.Reference)
                            throw new InvalidReferenceFieldExpcetion(joinField.DefinedIn.SystemName, joinField.SystemName, "Invalid link field type.");

                        if (referenceField.ReferencedProcess.SystemName != joinField.DefinedIn.SystemName)
                            throw new InvalidReferenceFieldExpcetion(joinField.DefinedIn.SystemName, joinField.SystemName, "Invalid link field.");

                        joinField.ReferenceField = referenceField;
                    }

                    return joinField;
                }
            }

            if (columnType == ColumnTypes.ReverseReference || columnType == ColumnTypes.ReverseMultiReference)
            {
                var rcrStep = (ReverseCrossRefRequiredStepEdit)fieldInfo.StepList.FirstOrDefault(s => s is ReverseCrossRefRequiredStepEdit);
                if (rcrStep != null)
                {
                    if (rcrStep.DisplayMultiple)
                        columnType = ColumnTypes.ReverseMultiReference;

                    if (!rcrStep.ReverseCrossRefProcessId.HasValue)
                        throw new InvalidReferenceFieldExpcetion(publishedProcess.SystemName, fieldInfo.SystemName, "Reverse cross reference process is null.");

                    var rcrOptions = (ReverseCrossRefOptionsStepEdit)fieldInfo.StepList.FirstOrDefault(s => s is ReverseCrossRefOptionsStepEdit);
                    if (rcrOptions != null)
                    {
                        var referencedProcess = Cache.GetProcessInfo(rcrStep.ReverseCrossRefProcessId.Value);
                        var crStep = Cache.GetCrossReferenceRequiredStep(referencedProcess.SystemName, rcrStep.CrossRefFieldName);

                        if (!crStep.CrossRefProcessId.HasValue)
                            throw new InvalidReferenceFieldExpcetion(referencedProcess.SystemName, rcrStep.CrossRefFieldName, "Cross reference process is null.");

                        var joinField = new ReferenceJoinFieldDefinition
                        {
                            Name = fieldInfo.Name,
                            SystemName = fieldInfo.SystemName,
                            ColumnType = columnType,
                            ShowLatestVersion = rcrOptions.ShowLatestVersion && referencedProcess.ProcessOption == ProcessOption.VersionEnabled,
                            DefinedIn = GetProcessDefinition(publishedProcess),
                            ReferencedProcess = GetProcessDefinition(referencedProcess),
                            ReferenceField = new ReferenceJoinFieldDefinition
                            {
                                SystemName = rcrStep.CrossRefFieldName,
                                ColumnType =
                                    crStep.AllowMultiple
                                        ? ColumnTypes.MultiReference
                                        : ColumnTypes.Reference,
                                DefinedIn = GetProcessDefinition(referencedProcess),
                                ReferencedProcess = GetProcessDefinition(publishedProcess)
                            }
                        };

                        return joinField;
                    }
                }
            }

            throw new InvalidReferenceFieldExpcetion(publishedProcess.SystemName, fieldInfo.SystemName, string.Format(@"Column type '{0}' is not valid for a join field.", columnType));
        }
Esempio n. 2
0
        private ReferenceJoinFieldDefinition GetJoinField(FieldInfoDto fieldInfo)
        {
            var columnType = (ColumnTypes)Enum.Parse(typeof(ColumnTypes), fieldInfo.DataType);
            var publishedProcess = Cache.GetProcessInfo(fieldInfo.DefinedIn);

            if (columnType == ColumnTypes.Reference || columnType == ColumnTypes.MultiReference)
            {
                if (fieldInfo.SystemName.Equals(Constants.CurrentStateColumnName, StringComparison.OrdinalIgnoreCase))
                {
                    return new ReferenceJoinFieldDefinition
                    {
                        Name = fieldInfo.Name,
                        SystemName = fieldInfo.SystemName,
                        ColumnType = columnType,
                        DefinedIn = GetProcessDefinition(publishedProcess),
                        ReferencedProcess = GetProcessDefinition(Constants.StateProcessName)
                    };
                }

                var crStep = Cache.GetCrossReferenceRequiredStep(fieldInfo.DefinedIn, fieldInfo.SystemName);

                if (!crStep.CrossRefProcessId.HasValue)
                    throw new InvalidReferenceFieldExpcetion(fieldInfo.DefinedIn, fieldInfo.SystemName, "Cross reference process is null.");

                var referencedProcess = Cache.GetProcessInfo(crStep.CrossRefProcessId.Value);

                var joinField = new ReferenceJoinFieldDefinition
                {
                    Name = fieldInfo.Name,
                    SystemName = fieldInfo.SystemName,
                    ColumnType = columnType,
                    DefinedIn = GetProcessDefinition(publishedProcess),
                    ReferencedProcess = GetProcessDefinition(referencedProcess)
                };

                if (columnType == ColumnTypes.MultiReference && !string.IsNullOrEmpty(crStep.LinkFieldSystemName))
                {
                    var referenceField = GetJoinField(referencedProcess.SystemName, crStep.LinkFieldSystemName);

                    if (referenceField.ColumnType != ColumnTypes.Reference)
                        throw new InvalidReferenceFieldExpcetion(fieldInfo.DefinedIn, fieldInfo.SystemName, "Invalid link field type.");

                    if (referenceField.ReferencedProcess.SystemName != fieldInfo.DefinedIn)
                        throw new InvalidReferenceFieldExpcetion(fieldInfo.DefinedIn, fieldInfo.SystemName, "Invalid link field.");

                    joinField.ReferenceField = referenceField;
                }

                return joinField;
            }

            if (columnType == ColumnTypes.ReverseReference || columnType == ColumnTypes.ReverseMultiReference || columnType == ColumnTypes.TreeView)
            {
                var rcrStep = Cache.GetReverseCrossReferenceRequiredStep(fieldInfo.DefinedIn, fieldInfo.SystemName);

                if (!rcrStep.ReverseCrossRefProcessId.HasValue)
                    throw new InvalidReferenceFieldExpcetion(fieldInfo.DefinedIn, fieldInfo.SystemName, "Reverse cross reference process is null.");

                var rcrOptions = Cache.GetReverseCrossReferenceOptionsStep(fieldInfo.DefinedIn, fieldInfo.SystemName);
                var referencedProcess = Cache.GetProcessInfo(rcrStep.ReverseCrossRefProcessId.Value);
                var referenceField = GetJoinField(referencedProcess.SystemName, rcrStep.CrossRefFieldName);

                var joinField = new ReferenceJoinFieldDefinition
                                    {
                                        Name = fieldInfo.Name,
                                        SystemName = fieldInfo.SystemName,
                                        ColumnType = columnType,
                                        ShowLatestVersion = rcrOptions.ShowLatestVersion && referencedProcess.ProcessOption == ProcessOption.VersionEnabled,
                                        DefinedIn = GetProcessDefinition(publishedProcess),
                                        ReferencedProcess = GetProcessDefinition(referencedProcess),
                                        ReferenceField = referenceField
                                    };

                return joinField;
            }

            if (columnType == ColumnTypes.Checklist)
            {
                var clStep = Cache.GetChecklistStep(fieldInfo.DefinedIn, fieldInfo.SystemName);

                if (string.IsNullOrEmpty(clStep.AnswerProcessSystemName))
                    throw new InvalidReferenceFieldExpcetion(fieldInfo.DefinedIn, fieldInfo.SystemName, "Checklist answer process is null.");

                var referencedProcess = Cache.GetProcessInfo(clStep.AnswerProcessSystemName);

                var joinField = new ReferenceJoinFieldDefinition
                                    {
                                        Name = fieldInfo.Name,
                                        SystemName = fieldInfo.SystemName,
                                        ColumnType = columnType,
                                        DefinedIn = GetProcessDefinition(publishedProcess),
                                        ReferencedProcess = GetProcessDefinition(referencedProcess)
                                    };

                return joinField;
            }

            throw new InvalidReferenceFieldExpcetion(fieldInfo.DefinedIn, fieldInfo.SystemName, string.Format(@"Column type '{0}' is not valid for a join field.", columnType));
        }