ArtifactFieldCollection
using Relativity.DataExchange.Service;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Runtime.CompilerServices;
namespace kCura.WinEDDS.Api
{
public class ArtifactFieldCollection : ICollection<ArtifactField>
{
private class ArtifactFieldNameComparer : IComparer<ArtifactField>
{
public int Compare1(ArtifactField x, ArtifactField y)
{
return string.Compare(x.DisplayName, y.DisplayName);
}
int IComparer<ArtifactField>.Compare(ArtifactField x, ArtifactField y)
{
return this.Compare1(x, y);
}
}
private readonly List<ArtifactField> _orderedList;
private readonly Hashtable _idLookup;
private readonly Hashtable _nameLookup;
private readonly Hashtable _typeLookup;
private readonly Hashtable _categoryLookup;
private ArtifactField _identifierField;
private ArtifactField _fileField;
private bool _outOfOrder;
public int Count => _orderedList.Count;
public bool IsReadOnly => false;
public ArtifactField this[int artifactId] {
get {
object objectValue = RuntimeHelpers.GetObjectValue(_idLookup[artifactId]);
if (objectValue != null)
return (ArtifactField)objectValue;
return null;
}
}
public ArtifactField this[string displayName] {
get {
object objectValue = RuntimeHelpers.GetObjectValue(_nameLookup[displayName]);
if (objectValue != null)
return (ArtifactField)objectValue;
return null;
}
}
public ArtifactField IdentifierField => _identifierField;
public ArtifactField FileField => _fileField;
public ArtifactField[] FieldList {
get {
if (_typeLookup.Contains(type))
return (ArtifactField[])((ArrayList)_typeLookup[type]).ToArray(typeof(ArtifactField));
return new ArtifactField[0];
}
}
public ArtifactField[] FieldList {
get {
if (_categoryLookup.Contains(category))
return (ArtifactField[])((ArrayList)_categoryLookup[category]).ToArray(typeof(ArtifactField));
return new ArtifactField[0];
}
}
public ArtifactFieldCollection()
{
_orderedList = new List<ArtifactField>();
_idLookup = new Hashtable();
_nameLookup = new Hashtable();
_typeLookup = new Hashtable();
_categoryLookup = new Hashtable();
_outOfOrder = true;
}
private void EnsureSortTheList()
{
if (_outOfOrder) {
_orderedList.Sort(new ArtifactFieldNameComparer());
_outOfOrder = false;
}
}
public void Add1(ArtifactField artifactField)
{
Add(artifactField);
}
void ICollection<ArtifactField>.Add(ArtifactField artifactField)
{
this.Add1(artifactField);
}
public void Clear()
{
_orderedList.Clear();
_idLookup.Clear();
_nameLookup.Clear();
_typeLookup.Clear();
_categoryLookup.Clear();
}
void ICollection<ArtifactField>.Clear()
{
this.Clear();
}
public bool Contains(ArtifactField artifactField)
{
return _orderedList.Contains(artifactField);
}
bool ICollection<ArtifactField>.Contains(ArtifactField artifactField)
{
return this.Contains(artifactField);
}
public void CopyTo(ArtifactField[] array, int arrayIndex)
{
EnsureSortTheList();
_orderedList.CopyTo(array, arrayIndex);
}
void ICollection<ArtifactField>.CopyTo(ArtifactField[] array, int arrayIndex)
{
this.CopyTo(array, arrayIndex);
}
public bool Remove(ArtifactField artifactField)
{
bool result = _orderedList.Remove(artifactField);
_outOfOrder = true;
return result;
}
bool ICollection<ArtifactField>.Remove(ArtifactField artifactField)
{
return this.Remove(artifactField);
}
public IEnumerator<ArtifactField> GetEnumerator()
{
EnsureSortTheList();
return (IEnumerator<ArtifactField>)_orderedList.GetEnumerator();
}
IEnumerator<ArtifactField> IEnumerable<ArtifactField>.GetEnumerator()
{
return this.GetEnumerator();
}
public IEnumerator GetEnumerator1()
{
EnsureSortTheList();
return (IEnumerator)_orderedList.GetEnumerator();
}
IEnumerator IEnumerable.GetEnumerator()
{
return this.GetEnumerator1();
}
public void Add(ArtifactField field)
{
_orderedList.Add(field);
_outOfOrder = true;
_idLookup.Add(field.ArtifactID, field);
_nameLookup.Add(field.DisplayName, field);
if (field.Category == FieldCategory.Identifier)
_identifierField = field;
if (field.Type == FieldType.File)
_fileField = field;
if (!_categoryLookup.ContainsKey(field.Category))
_categoryLookup.Add(field.Category, new ArrayList());
((ArrayList)_categoryLookup[field.Category]).Add(field);
if (!_typeLookup.ContainsKey(field.Type))
_typeLookup.Add(field.Type, new ArrayList());
((ArrayList)_typeLookup[field.Type]).Add(field);
}
public void AddRange(IEnumerable fields)
{
IEnumerator enumerator = default(IEnumerator);
try {
enumerator = fields.GetEnumerator();
while (enumerator.MoveNext()) {
ArtifactField field = (ArtifactField)enumerator.Current;
Add(field);
}
} finally {
if (enumerator is IDisposable)
(enumerator as IDisposable).Dispose();
}
}
}
}