示例#1
0
        public override SCField ConvertValueElement(SCField scField, Guid destFieldId, string elementValue, List <SCItem> destItems = null)
        {
            if (destItems == null || !destItems.Any())
            {
                elementValue = string.Empty;
                return(base.ConvertValueElement(scField, destFieldId, elementValue, destItems));
            }

            var itemElements = XmlHelper.GetXmlElementNodeList(elementValue, "item");

            if (itemElements == null || itemElements.Count == 0)
            {
                elementValue = string.Empty;
                return(base.ConvertValueElement(scField, destFieldId, elementValue, destItems));
            }

            var firstSelectedItemValue = itemElements.Item(0)?.InnerXml ?? string.Empty;

            var selectedItemId = destItems.FirstOrDefault(i =>
                                                          i.TemplateID == new Guid("{B3BDFE59-6667-4432-B261-05D0E3F7FDF6}") && // Item is Extendend List Item
                                                          string.Equals(
                                                              i.Fields.FirstOrDefault(f => f.FieldId == new Guid("{3A07C171-9BCA-464D-8670-C5703C6D3F11}"))?.Value, // Select Field Value
                                                              firstSelectedItemValue, StringComparison.InvariantCultureIgnoreCase))?.ID.ToString("B").ToUpper() ??
                                 string.Empty;

            return(CreateFieldFromElement(scField, destFieldId, selectedItemId));
        }
示例#2
0
        public override List <SCField> ConvertValueElementToFields(SCField scField, string elementValue)
        {
            List <SCField> convertedFields = new List <SCField>();

            var decodedElementValue = Uri.UnescapeDataString(elementValue).Replace("+", " ");

            var queryElement = XmlHelper.GetXmlElementNode(decodedElementValue, "query");

            if (queryElement != null)
            {
                if (queryElement.Attributes != null && queryElement.Attributes["t"] != null)
                {
                    var queryType = queryElement.Attributes["t"].Value;
                    if (string.Equals(queryType, "root", StringComparison.InvariantCultureIgnoreCase))
                    {
                        string rootItemId      = XmlHelper.GetXmlElementValue(queryElement.InnerXml, "value");
                        string textFieldValue  = queryElement.Attributes["tf"]?.Value ?? "__ItemName";
                        string valueFieldValue = queryElement.Attributes["vf"]?.Value ?? "__ItemName";

                        // Create fields
                        var datasourceField = CreateFieldFromElement(scField, new Guid("{5BE76442-950F-4C1F-A797-BEBD71101ABB}"), rootItemId, FieldType.Shared);
                        if (datasourceField != null)
                        {
                            convertedFields.Add(datasourceField);
                        }

                        if (!string.IsNullOrEmpty(textFieldValue))
                        {
                            var displayField =
                                CreateFieldFromElement(scField, new Guid("{492361E0-72D8-4847-82BA-EBFC235CF57B}"), textFieldValue, FieldType.Shared);
                            if (displayField != null)
                            {
                                convertedFields.Add(displayField);
                            }
                        }

                        if (!string.IsNullOrEmpty(valueFieldValue))
                        {
                            var valueField =
                                CreateFieldFromElement(scField, new Guid("{78778432-6327-4CEA-A28B-E190E3541D28}"), valueFieldValue, FieldType.Shared);
                            if (valueField != null)
                            {
                                convertedFields.Add(valueField);
                            }
                        }

                        var isDynamicField = CreateFieldFromElement(scField, new Guid("{54424E06-0E7A-47A7-8CB2-7383D700472F}"), "1", FieldType.Shared);
                        if (isDynamicField != null)
                        {
                            convertedFields.Add(isDynamicField);
                        }
                    }
                }
            }

            return(convertedFields);
        }
        public SCField ConvertField(SCField scField, Guid destFieldId)
        {
            var convertedValue = ConvertValue(scField.Value);

            if (convertedValue == null)
            {
                return(null);
            }
            return(CreateField(scField, destFieldId, convertedValue));
        }
        public virtual SCField ConvertValueElement(SCField scField, Guid destFieldId, string elementValue, List <SCItem> destItems = null)
        {
            var convertedValue = ConvertValue(elementValue);

            if (convertedValue == null)
            {
                return(null);
            }
            return(CreateFieldFromElement(scField, destFieldId, convertedValue));
        }
示例#5
0
        public List <SCField> CreateFields(MetadataTemplate.MetadataFields.MetadataNewField metadataNewField, Guid itemId, IEnumerable <Tuple <string, int> > langVersions, IEnumerable <string> languages)
        {
            SCField        destField  = new SCField();
            List <SCField> destFields = new List <SCField>();

            var fieldValue = GetValue(metadataNewField.value, metadataNewField.valueType);

            switch (metadataNewField.fieldType)
            {
            case FieldType.Shared:
                destField = CreateSharedField(metadataNewField.destFieldId, itemId, fieldValue);
                if (destField != null)
                {
                    destFields.Add(destField);
                }
                break;

            case FieldType.Versioned:
                foreach (var langVersion in langVersions)
                {
                    if (metadataNewField.values != null)
                    {
                        fieldValue = metadataNewField.values[langVersion] ?? fieldValue;
                    }
                    destField = CreateVersionedField(metadataNewField.destFieldId, itemId, fieldValue, langVersion.Item2, langVersion.Item1);
                    if (destField != null)
                    {
                        destFields.Add(destField);
                    }
                }
                break;

            case FieldType.Unversioned:
                foreach (var language in languages)
                {
                    var langVersion = new Tuple <string, int>(language, 1);
                    if (metadataNewField.values != null)
                    {
                        fieldValue = metadataNewField.values[langVersion] ?? fieldValue;
                    }
                    destField = CreateUnversionedField(metadataNewField.destFieldId, itemId, fieldValue, language);
                    if (destField != null)
                    {
                        destFields.Add(destField);
                    }
                }
                break;
                //default:
                //throw new ArgumentOutOfRangeException(); TODO: To implement meanful error message
            }

            return(destFields);
        }
示例#6
0
        private void DeleteVersionedField(SCField scField)
        {
            var dbField = _destMasterDb.VersionedFields.FirstOrDefault(i => i.Id == scField.Id);

            if (dbField != null)
            {
                _destMasterDb.VersionedFields.Remove(dbField);
                if (!_appSettings.enableOnlyAnalysisByDefault)
                {
                    _destMasterDb.SaveChanges();
                }
            }
        }
 public SCField CreateField(SCField scField, Guid destFieldId, string convertedValue)
 {
     return(new SCField()
     {
         Created = DateTime.Now,
         Updated = DateTime.Now,
         ItemId = scField.ItemId,
         Language = scField.Language,
         Version = scField.Version,
         Type = scField.Type,
         Value = convertedValue,
         FieldId = destFieldId,
         Id = scField.Id
     });
 }
 public SCField CreateFieldFromElement(SCField scField, Guid destFieldId, string convertedValue, FieldType fieldType)
 {
     return(new SCField()
     {
         Created = DateTime.UtcNow,
         Updated = DateTime.UtcNow,
         ItemId = scField.ItemId,
         Language = scField.Language,
         Version = scField.Version,
         Type = fieldType,
         Value = convertedValue,
         FieldId = destFieldId,
         Id = Guid.NewGuid()
     });
 }
示例#9
0
        public override List <SCItem> ConvertValueElementToItems(SCField scField, string elementValue, MetadataTemplate metadataTemplate, SCItem sourceItem)
        {
            List <SCItem> convertedItems = new List <SCItem>();

            var decodedElementValue = Uri.UnescapeDataString(elementValue).Replace("+", " ");

            var queryElements = XmlHelper.GetXmlElementNodeList(decodedElementValue, "query");

            if (queryElements != null && queryElements.Count > 0)
            {
                foreach (XmlNode queryElement in queryElements)
                {
                    if (queryElement.Attributes != null && queryElement.Attributes["t"] != null)
                    {
                        var queryType = queryElement.Attributes["t"].Value;
                        if (string.Equals(queryType, "default", StringComparison.InvariantCultureIgnoreCase))
                        {
                            var value                 = XmlHelper.GetXmlElementValue(queryElement.InnerXml, "value");
                            var displayName           = value;
                            var queryChildrenElements = XmlHelper.GetXmlElementNames(queryElement.InnerXml);
                            foreach (string queryChildrenElementName in queryChildrenElements)
                            {
                                if (!string.Equals(queryChildrenElementName, "value", StringComparison.InvariantCultureIgnoreCase))
                                {
                                    displayName = XmlHelper.GetXmlElementValue(queryElement.InnerXml, queryChildrenElementName);
                                }
                            }

                            if (!string.IsNullOrEmpty(value))
                            {
                                // Set item value
                                metadataTemplate.fields.newFields
                                .First(field => field.destFieldId == new Guid("{3A07C171-9BCA-464D-8670-C5703C6D3F11}")).value = value;
                                // Set display name
                                metadataTemplate.fields.newFields
                                .First(field => field.destFieldId == new Guid("{B5E02AD9-D56F-4C41-A065-A133DB87BDEB}")).value = displayName;
                                SCItem convertedItem = _itemFactory.Create(metadataTemplate.destTemplateId, sourceItem, value, metadataTemplate);
                                convertedItems.Add(convertedItem);
                            }
                        }
                    }
                }
            }

            return(convertedItems);
        }
示例#10
0
 public void AddUnmappedItemField(SCField field, Guid itemId)
 {
     AddReportingRecord(new ReportingRecord()
     {
         ItemId           = itemId.ToString("B").ToUpper(),
         ItemName         = _sourceMasterRepository.GetSitecoreItemName(itemId),
         ItemPath         = _sourceMasterRepository.GetItemPath(itemId),
         ItemVersion      = field.Version,
         ItemLanguage     = field.Language,
         ItemTemplateId   = _sourceMasterRepository.GetItemTemplateId(itemId).ToString("B").ToUpper(),
         ItemTemplateName = _sourceMasterRepository.GetSitecoreItemName(_sourceMasterRepository.GetItemTemplateId(itemId)),
         FieldId          = field.FieldId.ToString("B").ToUpper(),
         FieldName        = _sourceMasterRepository.GetSitecoreItemName(field.FieldId),
         FieldType        = field.Type.ToString(),
         FieldValue       = field.Value,
         Message          = "Source Field Not Mapped"
     });
 }
示例#11
0
        private bool ConvertSourceFieldToSubmitActionItem(SCItem form, Guid sourceFieldId,
                                                          string sourceFieldValue, string destItemName, Dictionary <Guid, string> destFieldValues, SCItem buttonItem)
        {
            SCField sourceFieldToConvert = null;

            if (form != null && sourceFieldId != Guid.Empty)
            {
                sourceFieldToConvert = form.Fields.FirstOrDefault(field => field.FieldId == sourceFieldId);
            }

            if (sourceFieldToConvert == null || sourceFieldToConvert.Value == sourceFieldValue)
            {
                CreateSubmitActionItem("SubmitActionDefinition", destItemName, destFieldValues, buttonItem);
                return(true);
            }

            return(false);
        }
示例#12
0
        private void AddOrUpdateSharedField(SCField scField)
        {
            var fieldCheck = _destMasterDb.SharedFields.FirstOrDefault(field =>
                                                                       field.FieldId == scField.FieldId && field.ItemId == scField.ItemId);

            _destMasterDb.SharedFields.AddOrUpdate(new SharedField()
            {
                Created = scField.Created,
                Updated = scField.Updated,
                FieldId = scField.FieldId,
                ItemId  = scField.ItemId,
                Value   = scField.Value,
                Id      = fieldCheck?.Id ?? scField.Id
            });
            if (!_appSettings.enableOnlyAnalysisByDefault)
            {
                _destMasterDb.SaveChanges();
            }
        }
 public virtual List <SCItem> ConvertValueElementToItems(SCField scField, string elementValue, MetadataTemplate metadataTemplate, SCItem sourceItem)
 {
     return(new List <SCItem>());
 }
示例#14
0
        private List <SCItem> ConvertFields(SCItem destItem, SCItem lastDescendantItem)
        {
            var destFields = new List <SCField>();
            var destItems  = new List <SCItem>();

            var sourceFields = destItem.Fields;

            var itemId = sourceFields.First().ItemId;

            IEnumerable <Tuple <string, int> > langVersions = sourceFields.Where(f => f.Version != null && f.Language != null).Select(f => new Tuple <string, int>(f.Language, (int)f.Version)).Distinct();
            var languages = sourceFields.Where(f => f.Language != null).Select(f => f.Language).Distinct();

            // Migrate existing fields
            if (_itemMetadataTemplate.fields.existingFields != null)
            {
                var filteredExistingFields = sourceFields.Where(f =>
                                                                _itemMetadataTemplate.fields.existingFields.Select(mf => mf.fieldId).Contains(f.FieldId));

                foreach (var filteredExistingField in filteredExistingFields)
                {
                    var existingField =
                        _itemMetadataTemplate.fields.existingFields.FirstOrDefault(mf => mf.fieldId == filteredExistingField.FieldId);

                    if (existingField != null)
                    {
                        destFields.Add(filteredExistingField);
                    }
                }
            }

            // Convert fields
            if (_itemMetadataTemplate.fields.convertedFields != null)
            {
                // Select only fields that are mapped
                var filteredConvertedFields = sourceFields.Where(f =>
                                                                 _itemMetadataTemplate.fields.convertedFields.Select(mf => mf.sourceFieldId).Contains(f.FieldId));

                foreach (var filteredConvertedField in filteredConvertedFields)
                {
                    var convertedField =
                        _itemMetadataTemplate.fields.convertedFields.FirstOrDefault(mf =>
                                                                                    mf.sourceFieldId == filteredConvertedField.FieldId);

                    if (convertedField != null)
                    {
                        // Process fields that have multiple dest fields
                        if (convertedField.destFields != null && convertedField.destFields.Any())
                        {
                            var valueElements = new List <string>();
                            try
                            {
                                valueElements = XmlHelper.GetXmlElementNames(filteredConvertedField.Value);
                            }
                            catch (Exception ex)
                            {
                                _logger.Log(new LogEntry(LoggingEventType.Error, string.Format("ItemConverter - Failed to parse Xml value for form field item. ItemID = {0} - FieldID = {1} - FieldValue_Decoded = {2}", itemId, filteredConvertedField.Id, filteredConvertedField.Value), ex));
                            }

                            var filteredValueElementsToMany = convertedField.destFields.Where(f =>
                                                                                              valueElements.Contains(f.sourceElementName.ToLower(), StringComparer.InvariantCultureIgnoreCase) && (f.destFieldId == null || f.destFieldId == Guid.Empty));

                            foreach (var valueXmlElementMapping in filteredValueElementsToMany)
                            {
                                // Special case for List Datasource fields
                                if (string.Equals(valueXmlElementMapping.sourceElementName, "Items",
                                                  StringComparison.InvariantCultureIgnoreCase))
                                {
                                    IFieldConverter converter = IoC.CreateConverter(valueXmlElementMapping.fieldConverter);

                                    List <SCField> convertedFields = converter?.ConvertValueElementToFields(filteredConvertedField,
                                                                                                            XmlHelper.GetXmlElementValue(filteredConvertedField.Value, valueXmlElementMapping.sourceElementName));
                                    if (convertedFields != null && convertedFields.Any())
                                    {
                                        destFields.AddRange(convertedFields);
                                    }

                                    // Delete existing list items
                                    var listItemMetadataTemplate = _metadataProvider.GetItemMetadataByTemplateName("ExtendedListItem");
                                    if (lastDescendantItem != null)
                                    {
                                        var listItems =
                                            _destMasterRepository.GetSitecoreChildrenItems(listItemMetadataTemplate.destTemplateId,
                                                                                           lastDescendantItem.ID);

                                        foreach (SCItem listItem in listItems)
                                        {
                                            _destMasterRepository.DeleteSitecoreItem(listItem);
                                        }
                                    }

                                    List <SCItem> convertedItems = converter?.ConvertValueElementToItems(filteredConvertedField,
                                                                                                         XmlHelper.GetXmlElementValue(filteredConvertedField.Value, valueXmlElementMapping.sourceElementName),
                                                                                                         listItemMetadataTemplate, lastDescendantItem ?? destItem);

                                    if (convertedItems != null && convertedItems.Any())
                                    {
                                        destItems.AddRange(convertedItems);
                                    }

                                    // Reporting
                                    if (convertedFields?.Count > 0 && convertedItems?.Count > 0)
                                    {
                                        _conversionReporter.AddUnmappedValueElementSourceField(filteredConvertedField, itemId, valueXmlElementMapping.sourceElementName, XmlHelper.GetXmlElementValue(filteredConvertedField.Value, valueXmlElementMapping.sourceElementName));
                                    }
                                }
                            }

                            var filteredValueElements =
                                convertedField.destFields.Where(f => valueElements.Contains(f.sourceElementName.ToLower(), StringComparer.InvariantCultureIgnoreCase) && (f.destFieldId != null && f.destFieldId != Guid.Empty));

                            foreach (var valueXmlElementMapping in filteredValueElements)
                            {
                                IFieldConverter converter = IoC.CreateConverter(valueXmlElementMapping.fieldConverter);

                                SCField destField = converter?.ConvertValueElement(filteredConvertedField, (Guid)valueXmlElementMapping.destFieldId, XmlHelper.GetXmlElementValue(filteredConvertedField.Value, valueXmlElementMapping.sourceElementName), destItems);

                                if (destField != null && destField.FieldId != Guid.Empty)
                                {
                                    destFields.Add(destField);
                                }
                            }

                            // Reporting
                            var unmappedValueElementSourceFields = valueElements.Where(v =>
                                                                                       !convertedField.destFields.Select(f => f.sourceElementName)
                                                                                       .Contains(v, StringComparer.InvariantCultureIgnoreCase));

                            foreach (var unmappedValueElementSourceField in unmappedValueElementSourceFields)
                            {
                                _conversionReporter.AddUnmappedValueElementSourceField(filteredConvertedField, itemId, unmappedValueElementSourceField, XmlHelper.GetXmlElementValue(filteredConvertedField.Value, unmappedValueElementSourceField));
                            }
                        }
                        // Process fields that have a single dest field
                        else if (convertedField.destFieldId != null && convertedField.destFieldId != Guid.Empty)
                        {
                            IFieldConverter converter = IoC.CreateConverter(convertedField.fieldConverter);
                            SCField         destField = converter?.ConvertField(filteredConvertedField, (Guid)convertedField.destFieldId);

                            if (destField != null && destField.FieldId != Guid.Empty)
                            {
                                destFields.Add(destField);
                            }
                        }
                    }
                }
            }

            if (_itemMetadataTemplate.fields.newFields != null)
            {
                // Create new fields
                foreach (var newField in _itemMetadataTemplate.fields.newFields)
                {
                    destFields.AddRange(_fieldFactory.CreateFields(newField, itemId, langVersions, languages));
                }
            }

            destItem.Fields = destFields;
            destItems.Add(destItem);

            // Merge multi-language List items with same value
            destItems = MergeListItems(destItems);

            // Reporting
            var unmappedSourceFields = sourceFields?.Where(f => (_itemMetadataTemplate.fields.existingFields == null || !_itemMetadataTemplate.fields.existingFields.Select(mf => mf.fieldId).Contains(f.FieldId)) &&
                                                           (_itemMetadataTemplate.fields.convertedFields == null || !_itemMetadataTemplate.fields.convertedFields.Select(mf => mf.sourceFieldId).Contains(f.FieldId)));

            foreach (SCField unmappedSourceField in unmappedSourceFields)
            {
                _conversionReporter.AddUnmappedItemField(unmappedSourceField, itemId);
            }

            return(destItems);
        }
示例#15
0
        public override List <SCItem> ConvertValueElementToItems(SCField scField, string elementValue, MetadataTemplate metadataTemplate, SCItem sourceItem)
        {
            List <SCItem> convertedItems = new List <SCItem>();

            var decodedElementValue = Uri.UnescapeDataString(elementValue).Replace("+", " ");

            XmlNodeList queryElements = null;

            try
            {
                queryElements = XmlHelper.GetXmlElementNodeList(decodedElementValue, "query", true);
            }
            catch (Exception ex)
            {
                _logger.Log(new LogEntry(LoggingEventType.Error,
                                         string.Format("ConvertValueElementToItems - Failed to parse Xml value. ItemID = {0} - FieldID = {1} - ElementName = {2} - ElementValue_Decoded = {3}",
                                                       scField.ItemId, scField.Id, "query", decodedElementValue), ex));
            }
            if (queryElements != null && queryElements.Count > 0)
            {
                foreach (XmlNode queryElement in queryElements)
                {
                    if (queryElement.Attributes != null && queryElement.Attributes["t"] != null)
                    {
                        var queryType = queryElement.Attributes["t"].Value;
                        if (string.Equals(queryType, "default", StringComparison.InvariantCultureIgnoreCase))
                        {
                            var value                 = XmlHelper.GetXmlElementValue(queryElement.InnerXml, "value");
                            var displayName           = value;
                            var displayNames          = new Dictionary <Tuple <string, int>, string>();
                            var queryChildrenElements = XmlHelper.GetXmlElementNames(queryElement.InnerXml);
                            foreach (string queryChildrenElementName in queryChildrenElements)
                            {
                                if (!string.Equals(queryChildrenElementName, "value", StringComparison.InvariantCultureIgnoreCase))
                                {
                                    displayName = XmlHelper.GetXmlElementValue(queryElement.InnerXml, queryChildrenElementName);

                                    displayNames.Add(new Tuple <string, int>(queryChildrenElementName, 1), displayName);
                                }
                            }

                            if (!string.IsNullOrEmpty(value))
                            {
                                // Set item value
                                metadataTemplate.fields.newFields
                                .First(field => field.destFieldId == new Guid("{3A07C171-9BCA-464D-8670-C5703C6D3F11}")).value = value;
                                // Set display name
                                if (displayNames.Any())
                                {
                                    metadataTemplate.fields.newFields
                                    .First(field => field.destFieldId == new Guid("{B5E02AD9-D56F-4C41-A065-A133DB87BDEB}")).values = displayNames;
                                }
                                else
                                {
                                    metadataTemplate.fields.newFields
                                    .First(field => field.destFieldId == new Guid("{B5E02AD9-D56F-4C41-A065-A133DB87BDEB}")).value = displayName;
                                }
                                SCItem convertedItem = _itemFactory.Create(metadataTemplate.destTemplateId, sourceItem, value, metadataTemplate);
                                convertedItems.Add(convertedItem);
                            }
                        }
                    }
                }
            }

            return(convertedItems);
        }
 public SCField CreateFieldFromElement(SCField scField, Guid destFieldId, string convertedValue)
 {
     return(CreateFieldFromElement(scField, destFieldId, convertedValue, scField.Type));
 }
 public virtual List <SCField> ConvertValueElementToFields(SCField scField, string elementValue)
 {
     return(new List <SCField>());
 }