diff --git a/Samples/VAF/XmlImporter/XmlImporter/LookupOrValuelistStrategy.cs b/Samples/VAF/XmlImporter/XmlImporter/LookupOrValuelistStrategy.cs
new file mode 100644
index 0000000..9bed74c
--- /dev/null
+++ b/Samples/VAF/XmlImporter/XmlImporter/LookupOrValuelistStrategy.cs
@@ -0,0 +1,28 @@
+namespace XmlImporter
+{
+ ///
+ /// The type to use a lookup filed.
+ ///
+ public enum LookupOrValuelistStrategy
+ {
+ ///
+ /// Don't search for something
+ ///
+ SearchNoWhere = 0,
+
+ ///
+ /// Search for an object item.
+ ///
+ SearchLookup = 1,
+
+ ///
+ /// Search for an valuelist item.
+ ///
+ SearchValueList = 2,
+
+ ///
+ /// Search for an value inside an object.
+ ///
+ SearchObjectValue = 3
+ }
+}
diff --git a/Samples/VAF/XmlImporter/XmlImporter/PropertySelector.cs b/Samples/VAF/XmlImporter/XmlImporter/PropertySelector.cs
index 8eccd19..b74a07e 100644
--- a/Samples/VAF/XmlImporter/XmlImporter/PropertySelector.cs
+++ b/Samples/VAF/XmlImporter/XmlImporter/PropertySelector.cs
@@ -19,5 +19,68 @@ public class PropertySelector
[DataMember(Order = 1)]
[MFPropertyDef]
public MFIdentifier PropertyDef { get; set; }
+
+ ///
+ /// Strategy how to search with Lookup, ValueList or Object value
+ ///
+ [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;
+
+ ///
+ /// Object to search for.
+ ///
+ [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; }
+
+ ///
+ /// ValueList to search for.
+ ///
+ [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; }
+
+ ///
+ /// If Lookup or MultiSelectlookup use ID or Name search.
+ ///
+ [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;
+
+ ///
+ /// Property where tp search inside an Object.
+ ///
+ [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; }
+
}
}
\ No newline at end of file
diff --git a/Samples/VAF/XmlImporter/XmlImporter/VaultApplication.ImportXmlFile.cs b/Samples/VAF/XmlImporter/XmlImporter/VaultApplication.ImportXmlFile.cs
index 8eb7abc..7c040e5 100644
--- a/Samples/VAF/XmlImporter/XmlImporter/VaultApplication.ImportXmlFile.cs
+++ b/Samples/VAF/XmlImporter/XmlImporter/VaultApplication.ImportXmlFile.cs
@@ -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;
+ }
+ }
+
+ }
///
/// Executes an , importing files to the vault as required.
///
@@ -261,10 +367,10 @@ public List ImportXmlFile(
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
@@ -272,11 +378,150 @@ public List ImportXmlFile(
.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 listLookup = new List();
+ 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 listLookup = new List();
+ 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);
}
diff --git a/Samples/VAF/XmlImporter/XmlImporter/XmlImporter.csproj b/Samples/VAF/XmlImporter/XmlImporter/XmlImporter.csproj
index 23460fc..cc8b275 100644
--- a/Samples/VAF/XmlImporter/XmlImporter/XmlImporter.csproj
+++ b/Samples/VAF/XmlImporter/XmlImporter/XmlImporter.csproj
@@ -60,6 +60,7 @@
+
diff --git a/Samples/VAF/XmlImporter/packages/MSBuildTasks.1.5.0.196/.signature.p7s b/Samples/VAF/XmlImporter/packages/MSBuildTasks.1.5.0.196/.signature.p7s
new file mode 100644
index 0000000..6626a86
Binary files /dev/null and b/Samples/VAF/XmlImporter/packages/MSBuildTasks.1.5.0.196/.signature.p7s differ