private bool ValidateAttributes(AssetTypeInfoType typeRequirements, AssetTypeInfoType type, AssetInfoType asset)
        {
            //get requirements
            var requirements =
                typeRequirements.AssetTypeAttributes.Where(
                    a => a.propertySetName != null && a.propertySetName.StartsWith("[required]"));

            //merge instance and type attributes
            var attrs = asset.AssetAttributes;
            attrs.AddRange(type.AssetTypeAttributes);

            //clear and fill in only required ones
            asset.AssetAttributes = new AttributeCollectionType();
            var allValid = true;
            foreach (var requirement in requirements)
            {
                //create new instance
                var attr = new AttributeType
                {
                    AttributeName = requirement.AttributeName,
                    AttributeCategory = "Check",
                    AttributeDescription = requirement.AttributeDescription,
                    propertySetName = requirement.propertySetName,
                    propertySetExternalIdentifier = requirement.propertySetExternalIdentifier
                };

                //add value if defined
                //prefix [F] if no value is defined or [T] if it is defined
                //this will be used to report validation result
                var valAttr = attrs.FirstOrDefault(a => a.AttributeName == requirement.AttributeName);
                if (valAttr != null && valAttr.AttributeValue != null && valAttr.AttributeValue.Item != null)
                {
                    var prefix = "[T]";
                    var valType = valAttr.AttributeValue.Item as ValueBaseType;
                    if (valType != null && !valType.HasValue())
                    {
                        allValid = false;
                        prefix = "[F]";
                    }

                    attr.AttributeValue = valAttr.AttributeValue;
                    attr.AttributeName = prefix + attr.AttributeName;
                }
                else
                {
                    allValid = false;
                    attr.AttributeName = "[F]" + attr.AttributeName;
                }

                asset.AssetAttributes.Add(attr);
            }

            asset.AssetName = (allValid ? "[T]" : "[F]") + asset.AssetName;
            return allValid;
        }
 private void ValidateAssets(FacilityType facility, AssetTypeInfoType required, string start)
 {
     //clear list of potentialy dummy assets
     required.Assets = new AssetCollectionType();
     var allValid = true;
     AssetTypeInfoType type;
     var assets = GetAssetsAndType(facility, start, out type);
     foreach (var asset in assets)
     {
         allValid = ValidateAttributes(required, type, asset) && allValid;
         if (asset != null)
             required.Assets.Add(asset);
     }
     required.AssetTypeName = (allValid ? "[T]" : "[F]") + required.AssetTypeName;
 }
 private IEnumerable<AssetInfoType> GetAssetsAndType(FacilityType facility, string start, out AssetTypeInfoType type)
 {
     var result = new List<AssetInfoType>();
     type = null;
     foreach (var assetType in facility.AssetTypes)
     {
         foreach (var instance in assetType.Assets)
         {
             if (instance.AssetName.StartsWith(start))
             {
                 type = assetType;
                 result.Add(instance);
             }
         }
     }
     return result;
 }