Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add multi select #16

Open
wants to merge 2 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
28 changes: 28 additions & 0 deletions Samples/VAF/XmlImporter/XmlImporter/LookupOrValuelistStrategy.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
namespace XmlImporter
{
/// <summary>
/// The type to use a lookup filed.
/// </summary>
public enum LookupOrValuelistStrategy
{
/// <summary>
/// Don't search for something
/// </summary>
SearchNoWhere = 0,

/// <summary>
/// Search for an object item.
/// </summary>
SearchLookup = 1,

/// <summary>
/// Search for an valuelist item.
/// </summary>
SearchValueList = 2,

/// <summary>
/// Search for an value inside an object.
/// </summary>
SearchObjectValue = 3
}
}
63 changes: 63 additions & 0 deletions Samples/VAF/XmlImporter/XmlImporter/PropertySelector.cs
Original file line number Diff line number Diff line change
Expand Up @@ -19,5 +19,68 @@ public class PropertySelector
[DataMember(Order = 1)]
[MFPropertyDef]
public MFIdentifier PropertyDef { get; set; }

/// <summary>
/// Strategy how to search with Lookup, ValueList or Object value
/// </summary>
[DataMember(Order = 2)]
[JsonConfEditor(Label = "Search type",
HelpText = "SearchNoWhere=don\'t search\nSearchLookup=use a lookup Name or ID\nSearchValueList=use a valuelist\nSearchObjectValue=use a object value",
DefaultValue = LookupOrValuelistStrategy.SearchNoWhere)]
public LookupOrValuelistStrategy LookupOrValuelistStrategy { get; set; }
= LookupOrValuelistStrategy.SearchNoWhere;

/// <summary>
/// Object to search for.
/// </summary>
[DataMember(Order = 3)]
[MFObjType(AllowEmpty = true)]
[JsonConfEditor(Label = "Object to search",
IsRequired = false,
Hidden = true,
HelpText = "Select Object to search",
ShowWhen = ".parent._children{.key == 'LookupOrValuelistStrategy' && (.value == 'SearchLookup' || .value == 'SearchObjectValue') }",
DefaultValue = null)]
public MFIdentifier LookupObjectDef { get; set; }

/// <summary>
/// ValueList to search for.
/// </summary>
[DataMember(Order = 3)]
[MFValueList(AllowEmpty = true)]
[JsonConfEditor(Label = "Valuelist",
IsRequired = false,
Hidden = true,
HelpText = "The Valuelist type to search for..",
ShowWhen = ".parent._children{.key == 'LookupOrValuelistStrategy' && .value == 'SearchValueList' }",
DefaultValue = null)]
public MFIdentifier LookupValueListDef { get; set; }

/// <summary>
/// If Lookup or MultiSelectlookup use ID or Name search.
/// </summary>
[DataMember(Order = 4)]
[JsonConfEditor(Label = "Use ID to search",
Hidden = true,
HelpText = "Yes = Search by ID, No = Search by Name.",
ShowWhen = ".parent._children{.key == 'LookupOrValuelistStrategy' && .value == 'SearchLookup' }",
DefaultValue = false)]
public bool SearchByLookupID { get; set; }
= false;

/// <summary>
/// Property where tp search inside an Object.
/// </summary>
[DataMember(Order = 4)]
[MFPropertyDef(AllowEmpty = true)]
[JsonConfEditor(Label = "Property to search",
IsRequired = false,
Hidden = true,
HelpText = "Select Property of Object Type to search",
ShowWhen = ".parent._children{.key == 'LookupOrValuelistStrategy' && .value == 'SearchObjectValue' }",
DefaultValue = null
)]
public MFIdentifier objSearchProperty { get; set; }

}
}
261 changes: 253 additions & 8 deletions Samples/VAF/XmlImporter/XmlImporter/VaultApplication.ImportXmlFile.cs
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,112 @@ namespace XmlImporter
{
public partial class VaultApplication
{
private Boolean CastToBool(string value)
{
var lbReturn = false;
if (value.ToLower() == "true")
lbReturn = true;
else if (value.ToLower() == "j")
lbReturn = true;
else if (value.ToLower() == "y")
lbReturn = true;
else if (value.ToLower() == "ja")
lbReturn = true;
else if (value.ToLower() == "yes")
lbReturn = true;
else if (value.ToLower() == "wahr")
lbReturn = true;
return lbReturn;
}
private int LookupRef(Vault vault, int ObjectID, MFDataType DataType, bool SearchLookupID, object value, LookupOrValuelistStrategy searchType = LookupOrValuelistStrategy.SearchLookup)
{
// Create list of search conditions.
var oSCs = new MFilesAPI.SearchConditions();

// Create single search condition.
var oSC = new MFilesAPI.SearchCondition();

// =================================================================================
// Filter not deleted
if (searchType == LookupOrValuelistStrategy.SearchLookup)
{
oSC.Expression.SetStatusValueExpression(MFStatusType.MFStatusTypeDeleted);
}
else
{
oSC.Expression.SetValueListItemExpression(MFValueListItemPropertyDef.MFValueListItemPropertyDefDeleted,
MFParentChildBehavior.MFParentChildBehaviorNone);
}
oSC.ConditionType = MFConditionType.MFConditionTypeEqual;
oSC.TypedValue.SetValue(MFDataType.MFDatatypeBoolean, false);
oSCs.Add(-1, oSC);

// =================================================================================
// Filter if it's object only objects
if (searchType == LookupOrValuelistStrategy.SearchLookup)
{
oSC.Expression.SetStatusValueExpression(MFStatusType.MFStatusTypeObjectTypeID);
oSC.ConditionType = MFConditionType.MFConditionTypeEqual;
oSC.TypedValue.SetValue(DataType, ObjectID);
oSCs.Add(-1, oSC);
}

// =================================================================================
// Filter Search by ID or name Value
if (SearchLookupID)
{
oSC.Expression.DataStatusValueType = MFStatusType.MFStatusTypeExtID;
oSC.ConditionType = MFConditionType.MFConditionTypeEqual;
oSC.TypedValue.SetValue(MFDataType.MFDatatypeText, value);
oSCs.Add(-1, oSC);
}
else
{
if (searchType == LookupOrValuelistStrategy.SearchLookup)
{
// object value search syntax
oSC.Expression.SetPropertyValueExpression((int)MFBuiltInPropertyDef.MFBuiltInPropertyDefNameOrTitle, MFParentChildBehavior.MFParentChildBehaviorNone);
oSC.ConditionType = MFConditionType.MFConditionTypeEqual;
oSC.TypedValue.SetValue(MFDataType.MFDatatypeText, value);
oSCs.Add(-1, oSC);
}
else
{
// valuelist value search syntax
oSC.Expression.SetValueListItemExpression(MFValueListItemPropertyDef.MFValueListItemPropertyDefName, MFParentChildBehavior.MFParentChildBehaviorNone);
oSC.ConditionType = MFConditionType.MFConditionTypeEqual;
oSC.TypedValue.SetValue(MFDataType.MFDatatypeText, value);
oSCs.Add(-1, oSC);
}
}

// execute the final search
if (searchType == LookupOrValuelistStrategy.SearchLookup)
{
var oResult = vault.ObjectSearchOperations.SearchForObjectsByConditionsEx(oSCs, MFSearchFlags.MFSearchFlagNone, false);
if (oResult.Count == 0)
{
return -1;
}
else
{
return oResult[1].ObjVer.ObjID.ID;
}
}
else
{
var vlResult = vault.ValueListItemOperations.SearchForValueListItemsEx(ObjectID, oSCs, false);
if (vlResult.Count == 0)
{
return -1;
}
else
{
return vlResult[1].ObjID.ID;
}
}

}
/// <summary>
/// Executes an <see cref="ImportInstruction"/>, importing files to the vault as required.
/// </summary>
Expand Down Expand Up @@ -261,22 +367,161 @@ public List<FileInfo> ImportXmlFile(Vault vault, ImportInstruction importInstruc
throw new InvalidOperationException("The property value selector property definition is not resolved");

// Retrieve the element for the property value.
var matchingPropertyElement = matchingElement
.XPathSelectElement(propertySelector.XPathQuery, xmlNamespaceManager);
if (null == matchingPropertyElement)
continue;
// var matchingPropertyElement = matchingElement
// .XPathSelectElement(propertySelector.XPathQuery, xmlNamespaceManager);
//if (null == matchingPropertyElement)
// continue;

// Find the property definition type.
var propertyDefType = vault
.PropertyDefOperations
.GetPropertyDef(propertySelector.PropertyDef.ID)
.DataType;

// Check if it's lookup or multilookup
var isLookup = ((propertyDefType == MFDataType.MFDatatypeMultiSelectLookup) || (propertyDefType == MFDataType.MFDatatypeLookup));

#region itterate XAttributes from XPath
if (propertySelector.XPathQuery.Contains("@"))
{
List<int> listLookup = new List<int>();
IEnumerable matchingPropertyAttributes =
(IEnumerable)matchingElement.XPathEvaluate(propertySelector.XPathQuery, xmlNamespaceManager);
foreach (System.Xml.Linq.XAttribute matchingPropertyAttribute in matchingPropertyAttributes)
{
string szValue = matchingPropertyAttribute.Value;

if (propertyDefType == MFDataType.MFDatatypeBoolean)
{
propertyValuesBuilder.Add(
propertySelector.PropertyDef.ID,
propertyDefType,
CastToBool(szValue));
}
else if (propertyDefType == MFDataType.MFDatatypeDate)
{
szValue = $"{szValue} 00:00:00";
propertyValuesBuilder.Add(
propertySelector.PropertyDef.ID,
propertyDefType,
szValue);
}
else if (isLookup)
{
var iLookupDef = (propertySelector.LookupOrValuelistStrategy == LookupOrValuelistStrategy.SearchLookup ?
propertySelector.LookupObjectDef.ID :
propertySelector.LookupValueListDef.ID);

var iLookupItem = LookupRef(vault,
iLookupDef,
propertyDefType,
propertySelector.SearchByLookupID,
szValue,
propertySelector.LookupOrValuelistStrategy);

if (iLookupItem != -1)
{
listLookup.Add(iLookupItem);
}
}
else
{
propertyValuesBuilder.Add(
propertySelector.PropertyDef.ID,
propertyDefType,
szValue);
}
}

// Lookup or MultiSelectLookup and found something
if ((isLookup) && (listLookup.Count != 0))
{
int[] arrLookupIDs = listLookup.ToArray();
propertyValuesBuilder.Add(
propertySelector.PropertyDef.ID,
propertyDefType,
arrLookupIDs);
}
}
#endregion
else
#region itterate XElements from XPath
{
List<int> listLookup = new List<int>();
var matchingPropertyElements =
matchingElement.XPathSelectElements(propertySelector.XPathQuery, xmlNamespaceManager);
if (null == matchingPropertyElements)
continue;

// iterate found XElements
foreach (var matchingPropertyElement in matchingPropertyElements)
{
if (null == matchingPropertyElement)
continue;

string szValue = matchingPropertyElement.Value;

if (propertyDefType == MFDataType.MFDatatypeBoolean)
{
propertyValuesBuilder.Add(
propertySelector.PropertyDef.ID,
propertyDefType,
CastToBool(szValue));
}
else if (propertyDefType == MFDataType.MFDatatypeDate)
{
szValue = $"{szValue} 00:00:00";
propertyValuesBuilder.Add(
propertySelector.PropertyDef.ID,
propertyDefType,
szValue);
}
else if (isLookup)
{
var iLookupDef = (propertySelector.LookupOrValuelistStrategy == LookupOrValuelistStrategy.SearchLookup ?
propertySelector.LookupObjectDef.ID :
propertySelector.LookupValueListDef.ID);

var iLookupItem = LookupRef(vault,
iLookupDef,
propertyDefType,
propertySelector.SearchByLookupID,
szValue,
propertySelector.LookupOrValuelistStrategy);

if (iLookupItem != -1)
{
listLookup.Add(iLookupItem);
}
propertyValuesBuilder.AddLookup(
propertySelector.PropertyDef.ID,
szValue);
}
else
{
propertyValuesBuilder.Add(
propertySelector.PropertyDef.ID,
propertyDefType,
szValue);
}
}
// Lookup or MultiSelectLookup and found something
if ((isLookup) && (listLookup.Count != 0))
{
int[] arrLookupIDs = listLookup.ToArray();
propertyValuesBuilder.Add(
propertySelector.PropertyDef.ID,
propertyDefType,
arrLookupIDs);
}
}
#endregion

// Add the property to the builder.
propertyValuesBuilder.Add(
propertySelector.PropertyDef.ID,
propertyDefType,
matchingPropertyElement.Value);
//propertyValuesBuilder.Add(
//propertySelector.PropertyDef.ID,
//propertyDefType,
//matchingPropertyElement.Value);

}

Expand Down
1 change: 1 addition & 0 deletions Samples/VAF/XmlImporter/XmlImporter/XmlImporter.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,7 @@
<ItemGroup>
<Compile Include="AttachedFileConfiguration.cs" />
<Compile Include="AttachedFileHandlingStrategy.cs" />
<Compile Include="LookupOrValuelistStrategy.cs" />
<Compile Include="Configuration.cs" />
<Compile Include="FileLocationStrategy.cs" />
<Compile Include="FileNotFoundHandlingStrategy.cs" />
Expand Down
Binary file not shown.