Exemple #1
0
        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);
        }
Exemple #2
0
        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);
        }
Exemple #3
0
        // 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);
        }
Exemple #4
0
        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));
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
Exemple #6
0
        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);
        }