private bool TryAddSimplePropertyValue(RDO rdo, PropertyInfo property, object propertyValue) { RelativityObjectFieldAttribute fieldAttribute = property.GetCustomAttribute <RelativityObjectFieldAttribute>(); if (fieldAttribute == null || fieldAttribute.FieldType == RdoFieldType.File) { return(false); } var relativityValue = ConvertPropertyValue(property, fieldAttribute.FieldType, propertyValue); rdo.Fields.Add(new FieldValue(fieldAttribute.FieldGuid, relativityValue)); return(true); }
public RDO ToRdo() { RelativityObjectAttribute objectTypeAttribute = this.GetType().GetCustomAttribute <RelativityObjectAttribute>(false); RDO rdo = new RDO(objectTypeAttribute.ObjectTypeGuid, ArtifactId); var parentProperty = this.GetParentArtifactIdProperty(); if (parentProperty != null) { var parentId = parentProperty.GetValue(this, null); if (parentId != null) { rdo.ParentArtifact = new kCura.Relativity.Client.DTOs.Artifact((int)parentId); } } foreach (PropertyInfo property in this.GetType().GetPublicProperties()) { object theFieldValue = null; RelativityObjectFieldAttribute fieldAttribute = property.GetCustomAttribute <RelativityObjectFieldAttribute>(); if (fieldAttribute != null) { object propertyValue = property.GetValue(this); if (propertyValue != null && fieldAttribute.FieldType != (int)RdoFieldType.File) { switch (fieldAttribute.FieldType) { case (int)RdoFieldType.Currency: case (int)RdoFieldType.Date: case (int)RdoFieldType.Decimal: case (int)RdoFieldType.Empty: case (int)RdoFieldType.LongText: case (int)RdoFieldType.WholeNumber: case (int)RdoFieldType.YesNo: case (int)RdoFieldType.User: theFieldValue = propertyValue; break; case (int)RdoFieldType.FixedLengthText: int stringLenght; stringLenght = property.GetCustomAttribute <RelativityObjectFieldAttribute>().Length != null? property.GetCustomAttribute <RelativityObjectFieldAttribute>().Length.Value: 3000; string theString = propertyValue as string; if (string.IsNullOrEmpty(theString) == false && theString.Length > stringLenght) { theString = theString.Substring(0, (stringLenght - 3)); theString += "..."; } theFieldValue = theString; break; case (int)RdoFieldType.MultipleChoice: // We have IList<Enum> values here var multiChoiceFieldValueList = new MultiChoiceFieldValueList(); IEnumerable enumEnumerable = propertyValue as IEnumerable; Type entryType = enumEnumerable.AsQueryable().ElementType; var enumValues = Enum.GetValues(entryType); foreach (var enumValueObject in enumEnumerable) { var memberInfo = entryType.GetMember(enumValueObject.ToString()); var relativityObjectAttribute = memberInfo[0].GetCustomAttribute <RelativityObjectAttribute>(); multiChoiceFieldValueList.Add(new kCura.Relativity.Client.DTOs.Choice(relativityObjectAttribute.ObjectTypeGuid)); } theFieldValue = multiChoiceFieldValueList; break; case (int)RdoFieldType.MultipleObject: var listOfObjects = new FieldValueList <kCura.Relativity.Client.DTOs.Artifact>(); foreach (int artifactId in (IList <int>)propertyValue) { listOfObjects.Add(new kCura.Relativity.Client.DTOs.Artifact(artifactId)); } theFieldValue = listOfObjects; break; case (int)RdoFieldType.SingleChoice: bool isEnumDefined = Enum.IsDefined(propertyValue.GetType(), propertyValue); if (isEnumDefined == true) { var choiceGuid = propertyValue.GetType().GetMember(propertyValue.ToString())[0].GetCustomAttribute <RelativityObjectAttribute>().ObjectTypeGuid; theFieldValue = new kCura.Relativity.Client.DTOs.Choice(choiceGuid); } break; case (int)RdoFieldType.SingleObject: if ((int)propertyValue > 0) { theFieldValue = new kCura.Relativity.Client.DTOs.Artifact((int)propertyValue); } break; case SharedConstants.FieldTypeCustomListInt: theFieldValue = ((IList <int>)propertyValue).ToSeparatedString(SharedConstants.ListIntSeparatorChar); break; case SharedConstants.FieldTypeByteArray: theFieldValue = Convert.ToBase64String((byte[])propertyValue); break; } rdo.Fields.Add(new FieldValue(fieldAttribute.FieldGuid, theFieldValue)); } } } foreach (PropertyInfo property in this.GetType().GetPublicProperties()) { object theFieldValue = null; RelativitySingleObjectAttribute singleObjectAttribute = property.GetCustomAttribute <RelativitySingleObjectAttribute>(); RelativityMultipleObjectAttribute multipleObjectAttribute = property.GetCustomAttribute <RelativityMultipleObjectAttribute>(); if (singleObjectAttribute != null) { int fieldsWithSameGuid = rdo.Fields.Where(c => c.Guids.Contains(singleObjectAttribute.FieldGuid)).Count(); if (fieldsWithSameGuid == 0) { object propertyValue = property.GetValue(this); if (propertyValue != null) { int artifactId = (int)propertyValue.GetType().GetProperty("ArtifactId").GetValue(propertyValue, null); if (artifactId != 0) { theFieldValue = new kCura.Relativity.Client.DTOs.Artifact(artifactId); rdo.Fields.Add(new FieldValue(singleObjectAttribute.FieldGuid, theFieldValue)); } else { theFieldValue = null; rdo.Fields.Add(new FieldValue(singleObjectAttribute.FieldGuid, theFieldValue)); } } } } if (multipleObjectAttribute != null) { int fieldsWithSameGuid = rdo.Fields.Where(c => c.Guids.Contains(multipleObjectAttribute.FieldGuid)).Count(); if (fieldsWithSameGuid == 0) { object propertyValue = property.GetValue(this); if (propertyValue != null) { var listOfObjects = new FieldValueList <kCura.Relativity.Client.DTOs.Artifact>(); foreach (var objectValue in propertyValue as IList) { int artifactId = (int)objectValue.GetType().GetProperty("ArtifactId").GetValue(objectValue, null); listOfObjects.Add(new kCura.Relativity.Client.DTOs.Artifact(artifactId)); } theFieldValue = listOfObjects; rdo.Fields.Add(new FieldValue(multipleObjectAttribute.FieldGuid, theFieldValue)); } } } } return(rdo); }
// TODO: Scope a US to replace the usage of kCura.Relativity.Client.FieldType with our own enum for only our usages public static T ToHydratedDto <T>(this RDO rdo) where T : BaseDto, new() { T returnDto = new T(); returnDto.ArtifactId = rdo.ArtifactID; foreach (PropertyInfo property in typeof(T).GetPublicProperties()) { RelativityObjectFieldAttribute fieldAttribute = property.GetCustomAttribute <RelativityObjectFieldAttribute>(); object newValueObject = null; if (fieldAttribute != null) { FieldValue theFieldValue = rdo[fieldAttribute.FieldGuid]; switch ((int)fieldAttribute.FieldType) { case (int)RdoFieldType.Currency: newValueObject = theFieldValue.ValueAsCurrency; break; case (int)RdoFieldType.Date: newValueObject = theFieldValue.ValueAsDate; break; case (int)RdoFieldType.Decimal: newValueObject = theFieldValue.ValueAsDecimal; break; case (int)RdoFieldType.Empty: newValueObject = null; break; case (int)RdoFieldType.File: if (theFieldValue.Value != null) { RelativityFile fileData = new RelativityFile(theFieldValue.ArtifactID); newValueObject = fileData; } break; case (int)RdoFieldType.FixedLengthText: newValueObject = theFieldValue.ValueAsFixedLengthText; break; case (int)RdoFieldType.LongText: newValueObject = theFieldValue.ValueAsLongText; break; case (int)RdoFieldType.MultipleChoice: // Means we have IList<some_enum> here, in fieldAttribute.ObjectDTOType var valueAsMultipleChoice = theFieldValue.ValueAsMultipleChoice; if (valueAsMultipleChoice != null) { var listOfEnumValuesDoNotUse = typeof(List <>).MakeGenericType(fieldAttribute.ObjectFieldDTOType); var listOfEnumValuesInstance = (IList)Activator.CreateInstance(listOfEnumValuesDoNotUse); foreach (var choice in valueAsMultipleChoice) { string choiceNameTrimmed = choice.Name.Replace(" ", "").Replace("-", "").Replace("(", "").Replace(")", ""); System.Array enumValues = System.Enum.GetValues(fieldAttribute.ObjectFieldDTOType); for (int i = 0; i < enumValues.Length; i++) { object theValueObject = enumValues.GetValue(i); if (theValueObject.ToString().Equals(choiceNameTrimmed, StringComparison.OrdinalIgnoreCase) == true) { listOfEnumValuesInstance.Add(theValueObject); } } } // Now we have a List<object> and we need it to be List<fieldAttribute.ObjectFieldDTOType> newValueObject = listOfEnumValuesInstance; } break; case (int)RdoFieldType.MultipleObject: newValueObject = theFieldValue.GetValueAsMultipleObject <kCura.Relativity.Client.DTOs.Artifact>() .Select <kCura.Relativity.Client.DTOs.Artifact, int>(artifact => artifact.ArtifactID).ToList(); break; case (int)RdoFieldType.SingleChoice: kCura.Relativity.Client.DTOs.Choice theChoice = theFieldValue.ValueAsSingleChoice; if (theChoice != null) { string choiceNameTrimmed = theChoice.Name.Replace(" ", "").Replace("-", "").Replace("(", "").Replace(")", ""); System.Array enumValues = System.Enum.GetValues(fieldAttribute.ObjectFieldDTOType); for (int i = 0; i < enumValues.Length; i++) { object theValueObject = enumValues.GetValue(i); if (theValueObject.ToString().Equals(choiceNameTrimmed, StringComparison.OrdinalIgnoreCase) == true) { newValueObject = theValueObject; break; } } } break; case (int)RdoFieldType.SingleObject: if (theFieldValue != null && theFieldValue.ValueAsSingleObject != null && theFieldValue.ValueAsSingleObject.ArtifactID > 0) { newValueObject = theFieldValue.ValueAsSingleObject.ArtifactID; } break; case (int)RdoFieldType.User: if (theFieldValue.Value != null) { if (property.PropertyType == typeof(User)) { newValueObject = theFieldValue.Value as User; } } break; case (int)RdoFieldType.WholeNumber: newValueObject = theFieldValue.ValueAsWholeNumber; break; case (int)RdoFieldType.YesNo: newValueObject = theFieldValue.ValueAsYesNo; break; case SharedConstants.FieldTypeCustomListInt: newValueObject = theFieldValue.ValueAsLongText.ToListInt(SharedConstants.ListIntSeparatorChar); break; case SharedConstants.FieldTypeByteArray: if (theFieldValue.ValueAsLongText != null) { newValueObject = Convert.FromBase64String(theFieldValue.ValueAsLongText); } break; } property.SetValue(returnDto, newValueObject); } } return(returnDto); }
public void UpdateField <T>(int rdoID, Guid fieldGuid, object value) where T : BaseDto, new() { RDO theRdo = new RDO(rdoID); theRdo.ArtifactTypeGuids.Add(BaseDto.GetObjectTypeGuid <T>()); Type fieldType = typeof(T).GetProperties().Where(p => p.GetFieldGuidValueFromAttribute() == fieldGuid).FirstOrDefault().PropertyType; if (fieldType.IsGenericType) { if (fieldType.GetGenericTypeDefinition() == typeof(IList <>)) { if ((value as IList).HeuristicallyDetermineType().IsEnum) { MultiChoiceFieldValueList choices = new MultiChoiceFieldValueList(); List <Guid> choiceValues = new List <Guid>(); foreach (var enumValue in (value as IList)) { choices.Add(new kCura.Relativity.Client.DTOs.Choice(((Enum)enumValue).GetRelativityObjectAttributeGuidValue())); } theRdo.Fields.Add(new FieldValue(fieldGuid, choices)); } if (value.GetType().GetGenericArguments() != null && value.GetType().GetGenericArguments().Length != 0) { if (value.GetType().GetGenericArguments()[0].IsSubclassOf(typeof(BaseDto))) { var listOfObjects = new FieldValueList <kCura.Relativity.Client.DTOs.Artifact>(); foreach (var objectValue in value as IList) { listOfObjects.Add(new kCura.Relativity.Client.DTOs.Artifact((int)objectValue.GetType().GetProperty("ArtifactId").GetValue(objectValue, null))); } theRdo.Fields.Add(new FieldValue(fieldGuid, listOfObjects)); } if (value.GetType().GetGenericArguments()[0].IsEquivalentTo(typeof(int))) { var listOfObjects = new FieldValueList <kCura.Relativity.Client.DTOs.Artifact>(); foreach (var objectValue in value as IList) { listOfObjects.Add(new kCura.Relativity.Client.DTOs.Artifact((int)objectValue)); } theRdo.Fields.Add(new FieldValue(fieldGuid, listOfObjects)); } } } else if (value == null) { theRdo.Fields.Add(new FieldValue(fieldGuid, value)); } else if (value.GetType() == typeof(string) || value.GetType() == typeof(int) || value.GetType() == typeof(bool) || value.GetType() == typeof(decimal) || value.GetType() == typeof(DateTime)) { theRdo.Fields.Add(new FieldValue(fieldGuid, value)); } UpdateRdo(theRdo); } else { RelativityObjectFieldAttribute fieldAttributeValue = typeof(T).GetProperties().Where(p => p.GetFieldGuidValueFromAttribute() == fieldGuid).FirstOrDefault().GetCustomAttribute <RelativityObjectFieldAttribute>(); if (fieldAttributeValue != null) { if (fieldAttributeValue.FieldType == (int)RdoFieldType.File) { if (value.GetType().BaseType != null) { if (value.GetType().BaseType.IsAssignableFrom(typeof(RelativityFile))) { InsertUpdateFileField(value as RelativityFile, rdoID); } } } if (fieldAttributeValue.FieldType == (int)RdoFieldType.User) { if (value.GetType() == typeof(User)) { theRdo.Fields.Add(new FieldValue(fieldGuid, value)); UpdateRdo(theRdo); } } if (value.GetType().IsEnum) { var choice = new kCura.Relativity.Client.DTOs.Choice(((Enum)value).GetRelativityObjectAttributeGuidValue()); theRdo.Fields.Add(new FieldValue(fieldGuid, choice)); UpdateRdo(theRdo); } if (value.GetType() == typeof(string) || value.GetType() == typeof(int) || value.GetType() == typeof(bool) || value.GetType() == typeof(decimal) || value.GetType() == typeof(DateTime)) { theRdo.Fields.Add(new FieldValue(fieldGuid, value)); UpdateRdo(theRdo); } } } }
protected void InsertUpdateFileField(BaseDto objectToInsert, int parentId) { foreach (var propertyInfo in objectToInsert.GetType().GetProperties().Where(c => c.GetCustomAttribute <RelativityObjectFieldAttribute>() != null)) { RelativityObjectFieldAttribute attributeValue = propertyInfo.GetCustomAttribute <RelativityObjectFieldAttribute>(); if (attributeValue.FieldType == (int)RdoFieldType.File) { RelativityFile relativityFile = propertyInfo.GetValue(objectToInsert) as RelativityFile; if (relativityFile != null) { if (relativityFile.FileValue != null) { if (relativityFile.FileValue.Path != null) { using (IRSAPIClient proxyToWorkspace = CreateProxy()) { var uploadRequest = new UploadRequest(proxyToWorkspace.APIOptions); uploadRequest.Metadata.FileName = relativityFile.FileValue.Path; uploadRequest.Metadata.FileSize = new FileInfo(uploadRequest.Metadata.FileName).Length; uploadRequest.Overwrite = true; uploadRequest.Target.FieldId = relativityFile.ArtifactTypeId; uploadRequest.Target.ObjectArtifactId = parentId; try { invokeWithRetryService.InvokeVoidMethodWithRetry(() => proxyToWorkspace.Upload(uploadRequest)); } catch (Exception ex) { throw ex; } } } else if (string.IsNullOrEmpty(relativityFile.FileMetadata.FileName) == false) { string tempPath = Path.GetTempPath(); string fileName = tempPath + relativityFile.FileMetadata.FileName; using (IRSAPIClient proxyToWorkspace = CreateProxy()) { System.IO.File.WriteAllBytes(fileName, relativityFile.FileValue.Data); var uploadRequest = new UploadRequest(proxyToWorkspace.APIOptions); uploadRequest.Metadata.FileName = fileName; uploadRequest.Metadata.FileSize = new FileInfo(uploadRequest.Metadata.FileName).Length; uploadRequest.Overwrite = true; uploadRequest.Target.FieldId = relativityFile.ArtifactTypeId; uploadRequest.Target.ObjectArtifactId = parentId; try { invokeWithRetryService.InvokeVoidMethodWithRetry(() => proxyToWorkspace.Upload(uploadRequest)); invokeWithRetryService.InvokeVoidMethodWithRetry(() => System.IO.File.Delete(fileName)); } catch (Exception) { invokeWithRetryService.InvokeVoidMethodWithRetry(() => System.IO.File.Delete(fileName)); } } } } } } } }
private static bool TryGetRelativityFieldValue <T>(PropertyInfo fieldProperty, object value, out object rdoValue) where T : BaseDto { rdoValue = null; Type fieldType = fieldProperty.PropertyType; if (fieldType.IsGenericType) { if (fieldType.GetGenericTypeDefinition() == typeof(IList <>)) { var valueList = value as IList; if (valueList.HeuristicallyDetermineType().IsEnum) { var choices = valueList.Cast <Enum>() .Select(x => new Choice(x.GetRelativityObjectAttributeGuidValue())) .ToList(); rdoValue = choices; return(true); } var genericArg = value.GetType().GetGenericArguments().FirstOrDefault(); if (genericArg?.IsSubclassOf(typeof(BaseDto)) == true) { rdoValue = valueList.Cast <object>() .Select(x => new Artifact((int)x.GetType().GetProperty(nameof(BaseDto.ArtifactId)).GetValue(x, null))) .ToList(); return(true); } if (genericArg?.IsEquivalentTo(typeof(int)) == true) { rdoValue = valueList.Cast <int>().Select(x => new Artifact(x)).ToList(); return(true); } } if (value == null) { return(true); } if (value.GetType() == typeof(string) || value.GetType() == typeof(int) || value.GetType() == typeof(bool) || value.GetType() == typeof(decimal) || value.GetType() == typeof(DateTime)) { rdoValue = value; return(true); } return(false); } RelativityObjectFieldAttribute fieldAttributeValue = fieldProperty.GetCustomAttribute <RelativityObjectFieldAttribute>(); if (fieldAttributeValue == null) { return(false); } if ((fieldAttributeValue.FieldType == RdoFieldType.File) && value.GetType().BaseType?.IsAssignableFrom(typeof(RelativityFile)) == true) { rdoValue = value; return(true); } if ((fieldAttributeValue.FieldType == RdoFieldType.User) && (value.GetType() == typeof(User))) { rdoValue = value; return(true); } if (value.GetType().IsEnum) { rdoValue = new Choice(((Enum)value).GetRelativityObjectAttributeGuidValue()); return(true); } if (value.GetType() == typeof(string) || value.GetType() == typeof(int) || value.GetType() == typeof(bool) || value.GetType() == typeof(decimal) || value.GetType() == typeof(DateTime)) { rdoValue = value; return(true); } return(false); }