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