Skip to content

Commit

Permalink
Merge pull request #105 from relativitydev/IGravityProvider
Browse files Browse the repository at this point in the history
create IGravityDao
  • Loading branch information
Arithmomaniac authored Jul 20, 2018
2 parents cc36b68 + 92d4edd commit 6ed4f9d
Show file tree
Hide file tree
Showing 10 changed files with 77 additions and 49 deletions.
10 changes: 5 additions & 5 deletions Gravity/Gravity.Test.Unit/RsapiDaoGetTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ public class RsapiDaoGetTests
public void GetHydratedDTO_BlankRDO()
{
var dao = new RsapiDao(GetChoiceRsapiProvider(null, null));
var dto = dao.GetRelativityObject<GravityLevelOne>(RootArtifactID, Base.ObjectFieldsDepthLevel.FirstLevelOnly);
var dto = dao.Get<GravityLevelOne>(RootArtifactID, Base.ObjectFieldsDepthLevel.FirstLevelOnly);
Assert.AreEqual(RootArtifactID, dto.ArtifactId);
}

Expand Down Expand Up @@ -60,22 +60,22 @@ public void GetHydratedDTO_DownloadsFileContents()
public void GetHydratedDTO_SingleChoice_InEnum()
{
var dao = new RsapiDao(GetChoiceRsapiProvider(2, null));
var dto = dao.GetRelativityObject<GravityLevelOne>(RootArtifactID, Base.ObjectFieldsDepthLevel.FirstLevelOnly);
var dto = dao.Get<GravityLevelOne>(RootArtifactID, Base.ObjectFieldsDepthLevel.FirstLevelOnly);
Assert.AreEqual(SingleChoiceFieldChoices.SingleChoice2, dto.SingleChoice);
}

[Test]
public void GetHydratedDTO_SingleChoice_NotInEnum()
{
var dao = new RsapiDao(GetChoiceRsapiProvider(5, null));
Assert.Throws<InvalidOperationException>(() => dao.GetRelativityObject<GravityLevelOne>(RootArtifactID, Base.ObjectFieldsDepthLevel.FirstLevelOnly));
Assert.Throws<InvalidOperationException>(() => dao.Get<GravityLevelOne>(RootArtifactID, Base.ObjectFieldsDepthLevel.FirstLevelOnly));
}

[Test]
public void GetHydratedDTO_MultipleChoice_AllInEnum()
{
var dao = new RsapiDao(GetChoiceRsapiProvider(null, new[] { 11, 13 }));
var dto = dao.GetRelativityObject<GravityLevelOne>(RootArtifactID, Base.ObjectFieldsDepthLevel.FirstLevelOnly);
var dto = dao.Get<GravityLevelOne>(RootArtifactID, Base.ObjectFieldsDepthLevel.FirstLevelOnly);
CollectionAssert.AreEquivalent(
new[] { MultipleChoiceFieldChoices.MultipleChoice1, MultipleChoiceFieldChoices.MultipleChoice3 },
dto.MultipleChoiceFieldChoices
Expand All @@ -87,7 +87,7 @@ public void GetHydratedDTO_MultipleChoice_NotAllInEnum()
{
//first item is in an enum, but not in our enum
var dao = new RsapiDao(GetChoiceRsapiProvider(null, new[] { 3, 13 }));
Assert.Throws<InvalidOperationException>(() => dao.GetRelativityObject<GravityLevelOne>(RootArtifactID, Base.ObjectFieldsDepthLevel.FirstLevelOnly));
Assert.Throws<InvalidOperationException>(() => dao.Get<GravityLevelOne>(RootArtifactID, Base.ObjectFieldsDepthLevel.FirstLevelOnly));

}

Expand Down
8 changes: 4 additions & 4 deletions Gravity/Gravity.Test/Helpers/TestObjectHelper.cs
Original file line number Diff line number Diff line change
Expand Up @@ -26,22 +26,22 @@ public TestObjectHelper(IServicesMgr servicesManager, int workspaceId, int numbe
_retrySettings = new InvokeWithRetrySettings(numberOfRetrySettings, 1000);
}

public int CreateTestObjectWithGravity<T>(BaseDto testObject)
public int CreateTestObjectWithGravity<T>(T testObject) where T : BaseDto
{
RsapiDao gravityRsapiDao = new RsapiDao(_servicesManager, _workspaceId, ExecutionIdentity.System, _retrySettings);

int testDtoId = gravityRsapiDao.InsertRelativityObject<T>(testObject);
int testDtoId = gravityRsapiDao.Insert(testObject);

return testDtoId;
}

public T ReturnTestObjectWithGravity<T>(int artifactId) where T : BaseDto, new()
{
RsapiDao gravityRsapiDao = new RsapiDao(_servicesManager, _workspaceId, ExecutionIdentity.System, _retrySettings);
return gravityRsapiDao.GetRelativityObject<T>(artifactId,ObjectFieldsDepthLevel.FirstLevelOnly);
return gravityRsapiDao.Get<T>(artifactId,ObjectFieldsDepthLevel.FirstLevelOnly);
}

public static RDO GetStubRDO<T>(int artifactId) where T : BaseDto, new()
public static RDO GetStubRDO<T>(int artifactId) where T : BaseDto
{
RelativityObjectAttribute objectTypeAttribute = typeof(T).GetCustomAttribute<RelativityObjectAttribute>(false);
RDO stubRdo = new RDO(objectTypeAttribute.ObjectTypeGuid, artifactId);
Expand Down
16 changes: 16 additions & 0 deletions Gravity/Gravity/DAL/IGravityDao.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
using Gravity.Base;
using System;
using System.Collections.Generic;

namespace Gravity.DAL
{
public interface IGravityDao
{
void Delete<T>(int artifactID) where T : BaseDto, new();
void Delete<T>(T obj) where T : BaseDto;
List<T> Get<T>(int[] artifactIDs, ObjectFieldsDepthLevel depthLevel) where T : BaseDto, new();
T Get<T>(int artifactID, ObjectFieldsDepthLevel depthLevel) where T : BaseDto, new();
int Insert<T>(T obj) where T : BaseDto;
void Update<T>(T obj) where T : BaseDto;
}
}
12 changes: 6 additions & 6 deletions Gravity/Gravity/DAL/RSAPI/RsapiDao.Delete.cs
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ protected void DeleteRDOs(List<int> artifactIds)
}
#endregion

internal void DeleteChildObjects<T>(IList<T> parentObjectList, List<int> artifactIds) where T : BaseDto, new()
internal void DeleteChildObjects<T>(IList<T> parentObjectList, List<int> artifactIds) where T : BaseDto
{
var childObjectsInfo = BaseDto.GetRelativityObjectChildrenListProperties<T>();

Expand All @@ -41,21 +41,21 @@ protected void DeleteRDOs(List<int> artifactIds)
DeleteRDOs(artifactIds);
}

public void DeleteRelativityObjectRecusively<T>(T theObjectToDelete) where T : BaseDto, new()
public void Delete<T>(T theObjectToDelete) where T : BaseDto
{
var childObjectsInfo = BaseDto.GetRelativityObjectChildrenListProperties<T>();
DeleteChildObjectsInner(theObjectToDelete, childObjectsInfo);
DeleteRDO(theObjectToDelete.ArtifactId);
}

public void DeleteRelativityObjectRecusively<T>(int objectToDeleteId) where T : BaseDto, new()
public void Delete<T>(int objectToDeleteId) where T : BaseDto, new()
{
T theObjectToDelete = GetRelativityObject<T>(objectToDeleteId, Base.ObjectFieldsDepthLevel.FullyRecursive);
DeleteRelativityObjectRecusively(theObjectToDelete);
T theObjectToDelete = Get<T>(objectToDeleteId, Base.ObjectFieldsDepthLevel.FullyRecursive);
Delete(theObjectToDelete);
}

private void DeleteChildObjectsInner<T>(T theObjectToDelete, IEnumerable<PropertyInfo> childProperties)
where T : BaseDto, new()
where T : BaseDto
{
foreach (var propertyInfo in childProperties)
{
Expand Down
14 changes: 7 additions & 7 deletions Gravity/Gravity/DAL/RSAPI/RsapiDao.Get.cs
Original file line number Diff line number Diff line change
Expand Up @@ -57,32 +57,32 @@ protected RelativityFile GetFile(int fileFieldArtifactId, int ourFileContainerIn

#endregion

public IEnumerable<T> GetAllDTOs<T>(Condition queryCondition = null, ObjectFieldsDepthLevel depthLevel = ObjectFieldsDepthLevel.FirstLevelOnly)
public IEnumerable<T> Query<T>(Condition queryCondition = null, ObjectFieldsDepthLevel depthLevel = ObjectFieldsDepthLevel.FirstLevelOnly)
where T : BaseDto, new()
{
IEnumerable<RDO> objectsRdos = GetRdos<T>(queryCondition);
return objectsRdos.Select(rdo => GetHydratedDTO<T>(rdo, depthLevel));
}

public IEnumerable<T> GetAllChildDTOs<T>(int parentArtifactID, ObjectFieldsDepthLevel depthLevel)
internal IEnumerable<T> GetAllChildDTOs<T>(int parentArtifactID, ObjectFieldsDepthLevel depthLevel)
where T : BaseDto, new()
{
var parentFieldGuid = typeof(T)
.GetPropertyAttributeTuples<RelativityObjectFieldParentArtifactIdAttribute>()
.First().Item2.FieldGuid;

Condition queryCondition = new WholeNumberCondition(parentFieldGuid, NumericConditionEnum.EqualTo, parentArtifactID);
return GetAllDTOs<T>(queryCondition, depthLevel);
return Query<T>(queryCondition, depthLevel);
}

public List<T> GetDTOs<T>(int[] artifactIDs, ObjectFieldsDepthLevel depthLevel)
public List<T> Get<T>(int[] artifactIDs, ObjectFieldsDepthLevel depthLevel)
where T : BaseDto, new()
{
List<RDO> objectsRdos = GetRdos(artifactIDs);
return objectsRdos.Select(rdo => GetHydratedDTO<T>(rdo, depthLevel)).ToList();
}

public T GetRelativityObject<T>(int artifactID, ObjectFieldsDepthLevel depthLevel)
public T Get<T>(int artifactID, ObjectFieldsDepthLevel depthLevel)
where T : BaseDto, new()
{
RDO objectRdo = GetRdo(artifactID);
Expand Down Expand Up @@ -180,7 +180,7 @@ private object GetChildObjectRecursively(BaseDto baseDto, RDO objectRdo, ObjectF
.Select(artifact => artifact.ArtifactID)
.ToArray();

var allObjects = this.InvokeGenericMethod(objectType, nameof(GetDTOs), childArtifactIds, depthLevel) as IEnumerable;
var allObjects = this.InvokeGenericMethod(objectType, nameof(Get), childArtifactIds, depthLevel) as IEnumerable;

return MakeGenericList(allObjects, objectType);
}
Expand All @@ -198,7 +198,7 @@ private object GetChildObjectRecursively(BaseDto baseDto, RDO objectRdo, ObjectF
var childArtifactId = childArtifact.ArtifactID;
return childArtifactId == 0
? Activator.CreateInstance(objectType)
: this.InvokeGenericMethod(objectType, nameof(GetRelativityObject), childArtifactId, depthLevel);
: this.InvokeGenericMethod(objectType, nameof(Get), childArtifactId, depthLevel);
}
}

Expand Down
12 changes: 6 additions & 6 deletions Gravity/Gravity/DAL/RSAPI/RsapiDao.Insert.cs
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,7 @@ private void InsertChildListObjectsWithDynamicType(BaseDto theObjectToInsert, in
}
}

private static void SetParentArtifactID<T>(T objectToBeInserted, int parentArtifactId) where T : BaseDto, new()
private static void SetParentArtifactID<T>(T objectToBeInserted, int parentArtifactId) where T : BaseDto
{
PropertyInfo parentArtifactIdProperty = objectToBeInserted.GetParentArtifactIdProperty();

Expand All @@ -89,8 +89,8 @@ private void InsertChildListObjectsWithDynamicType(BaseDto theObjectToInsert, in
}
#endregion

public void InsertChildListObjects<T>(IList<T> objectsToInserted, int parentArtifactId)
where T : BaseDto, new()
internal void InsertChildListObjects<T>(IList<T> objectsToInserted, int parentArtifactId)
where T : BaseDto
{
var childObjectsInfo = BaseDto.GetRelativityObjectChildrenListProperties<T>();

Expand Down Expand Up @@ -135,7 +135,7 @@ private bool InsertSingleObjectFields(BaseDto objectToInsert)
if (fieldValue != null)
{
Type objType = fieldValue.GetType();
var newArtifactId = this.InvokeGenericMethod(objType, "InsertRelativityObject", fieldValue);
var newArtifactId = this.InvokeGenericMethod(objType, nameof(Insert), fieldValue);
fieldValue.ArtifactId = (int)newArtifactId;
}
}
Expand Down Expand Up @@ -166,7 +166,7 @@ private bool InsertMultipleObjectFields(BaseDto objectToInsert)
if (((childObject as BaseDto).ArtifactId == 0))
{
Type objType = childObject.GetType();
var newArtifactId = this.InvokeGenericMethod(objType, "InsertRelativityObject", childObject);
var newArtifactId = this.InvokeGenericMethod(objType, nameof(Insert), childObject);
(childObject as BaseDto).ArtifactId = (int)newArtifactId;
}
else
Expand All @@ -179,7 +179,7 @@ private bool InsertMultipleObjectFields(BaseDto objectToInsert)
return true;
}

public int InsertRelativityObject<T>(BaseDto theObjectToInsert)
public int Insert<T>(T theObjectToInsert) where T : BaseDto
{
//TODO: should think about some sort of transaction type around this. If any parts of this fail, it should all fail
InsertSingleObjectFields(theObjectToInsert);
Expand Down
11 changes: 6 additions & 5 deletions Gravity/Gravity/DAL/RSAPI/RsapiDao.Update.cs
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ protected void UpdateRdo(RDO theRdo)

//inserts *child* lists of a parent artifact ID (not associated artifacts)
protected void UpdateChildListObjects<T>(IList<T> objectsToUpdate, int parentArtifactId)
where T : BaseDto, new()
where T : BaseDto
{
var objectsToBeInsertedLookup = objectsToUpdate.ToLookup(x => x.ArtifactId == 0);
var objectsToBeInserted = objectsToBeInsertedLookup[true];
Expand Down Expand Up @@ -71,8 +71,8 @@ protected void UpdateChildListObjects<T>(IList<T> objectsToUpdate, int parentArt

#endregion

public void UpdateRelativityObject<T>(BaseDto theObjectToUpdate)
where T : BaseDto , new()
public void Update<T>(T theObjectToUpdate)
where T : BaseDto
{
var childObjectsInfo = BaseDto.GetRelativityObjectChildrenListProperties<T>();
UpdateRelativityObject(theObjectToUpdate, childObjectsInfo);
Expand All @@ -99,8 +99,9 @@ private void UpdateRelativityObject(BaseDto theObjectToUpdate, IEnumerable<Prope
}
}

[Obsolete("This class will be replaced by a version that gets the field via lambda")]
public void UpdateField<T>(int rdoID, Guid fieldGuid, object value)
where T : BaseDto, new()
where T : BaseDto
{
PropertyInfo fieldProperty = typeof(T).GetProperties()
.SingleOrDefault(p => p.GetCustomAttribute<RelativityObjectFieldAttribute>()?.FieldGuid == fieldGuid);
Expand All @@ -125,7 +126,7 @@ public void UpdateField<T>(int rdoID, Guid fieldGuid, object value)
}

private static bool TryGetRelativityFieldValue<T>(PropertyInfo fieldProperty, object value, out object rdoValue)
where T : BaseDto, new()
where T : BaseDto
{
rdoValue = null;

Expand Down
4 changes: 2 additions & 2 deletions Gravity/Gravity/DAL/RSAPI/RsapiDao.cs
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@

namespace Gravity.DAL.RSAPI
{
public partial class RsapiDao
public partial class RsapiDao : IGravityDao
{
private const int DefaultBatchSize = 1000;

Expand All @@ -14,7 +14,7 @@ public partial class RsapiDao
protected ChoiceCache choiceCache;

public RsapiDao(IServicesMgr servicesManager, int workspaceId, ExecutionIdentity executionIdentity,
InvokeWithRetrySettings invokeWithRetrySettings = null,
InvokeWithRetrySettings invokeWithRetrySettings = null,
int batchSize = DefaultBatchSize)
: this(servicesManager, workspaceId, executionIdentity, GetInvokeWithRetryService(invokeWithRetrySettings), batchSize)

Expand Down
18 changes: 16 additions & 2 deletions Gravity/Gravity/Extensions/TypeExtensions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,22 @@ public static class TypeExtensions
public static object InvokeGenericMethod(this object obj, Type typeArgument, string methodName, params object[] args)
{
MethodInfo method = obj.GetType()
.GetMethod(methodName, BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance)
.MakeGenericMethod(new Type[] { typeArgument });
.GetMethods(BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance)
.Where(x => x.Name == methodName && x.IsGenericMethodDefinition)
.Select(x => x.MakeGenericMethod(new Type[] { typeArgument }))
.Single(x =>
{
//get the overload with matching parameters
var parameters = x.GetParameters();
//not matching parameters if diff number parameters
if (parameters.Length != args.Length) return false;
//make sure each parameter is resolvable from the type
return Enumerable.Zip(
parameters,
args,
(p, a) => p.ParameterType.IsAssignableFrom(a.GetType()))
.All(y => y);
});

try
{
Expand Down
21 changes: 9 additions & 12 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -89,30 +89,27 @@ public enum OrderType
To use Gravity for RSAPI operations, you must instantiate an `RsapiDao` object using the `RsapiDao` constructor, with `IHelper` and `WorkspaceId` as parameters.

Supported RSAPIDao methods:
- `GetRelativityObject<T>(int artifactId, ObjectFieldsDepthLevel depthLevel)` - Get DTO by Artifact ID and specific depth level of child objects and object fields.
- `GetDTOs<T>(int[] artifactIDs, ObjectFieldsDepthLevel depthLevel)` - Get DTOs by Artifact IDs and specific depth level of child objects and object
- `Get<T>(int artifactId, ObjectFieldsDepthLevel depthLevel)` - Get DTO by Artifact ID and specific depth level of child objects and object fields.
- `Get<T>(int[] artifactIDs, ObjectFieldsDepthLevel depthLevel)` - Get DTOs by Artifact IDs and specific depth level of child objects and object
fields.
- `List<T> GetAllChildDTOs<T>(Guid parentFieldGuid, int parentArtifactID, ObjectFieldsDepthLevel depthLevel)` - Get all child DTOs of type for parent.
- `List<T> GetAllDTOs<T>(Condition queryCondition = null, ObjectFieldsDepthLevel depthLevel = ObjectFieldsDepthLevel.FirstLevelOnly)`
- `List<T> GetAllDTOs<T>()` - Get all DTOs of type.
- `DeleteRelativityObjectRecusively<T>(T theObjectToDelete)` - Delete object recursively (includes child objects).
- `DeleteRelativityObjectRecusively<T>(int objectToDeleteId)`- Delete object recursively (includes child objects) by Artifact ID.
- `InsertChildListObjects<T>(IList<T> objectsToInserted, int parentArtifactId)` - Insert Child objects for parent.
- `InsertRelativityObject<T>(BaseDto theObjectToInsert)` - Insert Relativity object from RDO.
- `UpdateRelativityObject<T>(BaseDto theObjectToUpdate)` - Update Relativity object from RDO.
- `List<T> Query<T>(Condition queryCondition = null, ObjectFieldsDepthLevel depthLevel = ObjectFieldsDepthLevel.FirstLevelOnly)` - Get all DTOs of type matching an optional condition
- `Delete<T>(T theObjectToDelete)` - Delete object recursively (includes child objects).
- `Delete<T>(int objectToDeleteId)`- Delete object recursively (includes child objects) by Artifact ID.
- `Insert<T>(BaseDto theObjectToInsert)` - Insert Relativity object from RDO.
- `Update<T>(BaseDto theObjectToUpdate)` - Update Relativity object from RDO.
- `UpdateField<T>(int rdoID, Guid fieldGuid, object value)` - Update field value by GUID and RDO Artifact ID

### Example

The following example demonstrates a object "Get" used in Event handler. First we instantiate `RsapiDao` and then we use the Gravity RSAPI Dao `GetRelativityObject` method to get the object (`ObjectFieldsDepthLevel.OnlyParentObject` means that we want just the object - no child object fields, multiple object fields or single object fields are populated recursively):
The following example demonstrates a object "Get" used in Event handler. First we instantiate `RsapiDao` and then we use the Gravity RSAPI Dao `Get` method to get the object (`ObjectFieldsDepthLevel.OnlyParentObject` means that we want just the object - no child object fields, multiple object fields or single object fields are populated recursively):
```csharp
public override Response Execute()
{
Response returnResponse = new Response() { Message = string.Empty, Success = true };

RsapiDao gravityRsapiDao = new RsapiDao(this.Helper, this.Helper.GetActiveCaseID());

DemoPurchaseOrder demoOrder = gravityRsapiDao.GetRelativityObject<DemoPurchaseOrder>(1047088,
DemoPurchaseOrder demoOrder = gravityRsapiDao.Get<DemoPurchaseOrder>(1047088,
ObjectFieldsDepthLevel.OnlyParentObject);

return returnResponse;
Expand Down

0 comments on commit 6ed4f9d

Please sign in to comment.