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)); }
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)); }