< Summary

Information
Class: ValidateLib.Control.Controller
Assembly: validatelib.dll
File(s): C:\skola_karlovka\RP\code\csv-validator\CSV_Validator\ValidateLib\Control\Controller.cs
Line coverage
79%
Covered lines: 118
Uncovered lines: 30
Coverable lines: 148
Total lines: 378
Line coverage: 79.7%
Branch coverage
N/A
Covered branches: 0
Total branches: 0
Branch coverage: N/A
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

File(s)

C:\skola_karlovka\RP\code\csv-validator\CSV_Validator\ValidateLib\Control\Controller.cs

#LineLine coverage
 1using Newtonsoft.Json.Linq;
 2using ValidateLib.ErrorsAndWarnings.Errors;
 3using ValidateLib.IRINormalization;
 4using ValidateLib.Metadata.MetdataLocation;
 5using ValidateLib.Metadata.ParsingAndValidation;
 6using ValidateLib.Metadata.Unification;
 7using ValidateLib.Results;
 8using ValidateLib.TableCompatibility;
 9using ValidateLib.TabularData.Parsing;
 10using ValidateLib.TabularData.Validation;
 11using ValidateLib.UtilityClasses;
 12
 13namespace ValidateLib.Control
 14{
 15    public class Controller : IController
 16    {
 17        #region Public
 18        public IResult ProcessMetadata(string metadataIRI)
 19        {
 120            ITableGroupValidationDetail validationDetails = new TableGroupValidationResultDetails();
 21            try
 22            {
 123                ProcessMetadataUnsafe(metadataIRI, validationDetails);
 124            }
 125            catch (Error error)
 26            {
 127                validationDetails.GeneralErrors.Add(error);
 128            }
 129            catch (Exception ex)
 30            {
 131                validationDetails.GeneralErrors.Add(ErrorFactory.GetUnknownError(ex.Message));
 132                return ResultCreator.CreateResult(validationDetails);
 33            }
 34
 135            return ResultCreator.CreateResult(validationDetails);
 136        }
 37        public IResult ProcessTabularData(string tabularDataIRI)
 38        {
 139            ITableGroupValidationDetail validationDetails = new TableGroupValidationResultDetails();
 40            try
 41            {
 142                ProcessTabularDataUnsafe(tabularDataIRI, validationDetails);
 143            }
 044            catch (Error error)
 45            {
 046                validationDetails.GeneralErrors.Add(error);
 047            }
 048            catch (Exception ex)
 49            {
 050                validationDetails.GeneralErrors.Add(ErrorFactory.GetUnknownError(ex.Message));
 051                return ResultCreator.CreateResult(validationDetails);
 52            }
 53
 154            return ResultCreator.CreateResult(validationDetails);
 055        }
 56        public IResult ProcessOverriding(string metadataIRI, params string[] tabularDataIRIs)
 57        {
 158            ITableGroupValidationDetail validationDetails = new TableGroupValidationResultDetails();
 59            try
 60            {
 161                ProcessOverridingUnsafe(metadataIRI, validationDetails, tabularDataIRIs);
 162            }
 063            catch (Error error)
 64            {
 065                validationDetails.GeneralErrors.Add(error);
 066            }
 067            catch (Exception e)
 68            {
 069                validationDetails.GeneralErrors.Add(ErrorFactory.GetUnknownError(e.Message));
 070            }
 171            return ResultCreator.CreateResult(validationDetails);
 72        }
 73        #endregion
 74
 75        #region Metadata
 76        void ProcessMetadataUnsafe(string metadataIRI, ITableGroupValidationDetail validationDetails)
 77        {
 178            if (IriUtilityClass.IsRemoteIri(metadataIRI))
 79            {
 180                ProcessMetadataRemote(metadataIRI, validationDetails);
 81            }
 82            else
 83            {
 184                ProcessMetadataLocal(metadataIRI, validationDetails);
 85            }
 186        }
 87        void ProcessMetadataRemote(string metadataURL, ITableGroupValidationDetail validationDetails)
 88        {
 89
 190            JObject? descriptorObject = ObjectPropertyUtilityClass.GetDescriptor(metadataURL);
 191            if (descriptorObject is not null)
 92            {
 193                HandleMetadataFoundCase(metadataURL, descriptorObject, validationDetails);
 94            }
 95            else
 96            {
 197                validationDetails.GeneralErrors.Add(ErrorFactory.GetMetadataFileCouldNotBeLoadedError(metadataURL));
 98            }
 199        }
 100        void ProcessMetadataLocal(string metadataPath, ITableGroupValidationDetail validationDetails)
 101        {
 102
 1103            JObject? descriptorObject = ObjectPropertyUtilityClass.GetDescriptor(metadataPath);
 1104            if (descriptorObject is not null)
 105            {
 1106                HandleMetadataFoundCase(metadataPath, descriptorObject, validationDetails);
 107            }
 108            else
 109            {
 1110                validationDetails.GeneralErrors.Add(ErrorFactory.GetMetadataFileCouldNotBeLoadedError(metadataPath));
 111            }
 112
 1113        }
 114        #endregion
 115
 116        #region Tabular
 117        void ProcessTabularDataUnsafe(string tabularDataIRI, ITableGroupValidationDetail validationDetails)
 118        {
 1119            if (IriUtilityClass.IsRemoteIri(tabularDataIRI))
 120            {
 1121                ProcessTabularDataRemote(tabularDataIRI, validationDetails);
 122            }
 123            else
 124            {
 1125                ProcessTabularDataLocal(tabularDataIRI, validationDetails);
 126            }
 1127        }
 128        void ProcessTabularDataLocal(string tabularDataPath, ITableGroupValidationDetail validationDetails)
 129        {
 1130            var metadataLocator = new MetadataLocator()
 1131            {
 1132                warnings = validationDetails.GeneralWarnings
 1133            };
 1134            tabularDataPath = IRINormalizator.NormalizeIri(tabularDataPath);
 1135            string? metadataPath = metadataLocator.LocateMetadataForLocalFile(tabularDataPath);
 136
 1137            if (metadataPath is not null)
 138            {
 1139                JObject? descriptorObject = ObjectPropertyUtilityClass.GetDescriptor(metadataPath);
 1140                if (descriptorObject is not null)
 141                {
 1142                    HandleMetadataFoundCase(metadataPath, descriptorObject, validationDetails);
 143
 144                }
 145                else
 146                {
 0147                    validationDetails.GeneralErrors.Add(ErrorFactory.GetMetadataFileCouldNotBeLoadedError(tabularDataPat
 148                }
 149            }
 150            else
 151            {
 1152                ProcessTabularDataFileWithoutMetadata(tabularDataPath, validationDetails);
 153            }
 1154        }
 155        void ProcessTabularDataRemote(string tabularDataURL, ITableGroupValidationDetail validationDetails)
 156        {
 1157            MetadataLocator metadataLocator = new MetadataLocator()
 1158            {
 1159                warnings = validationDetails.GeneralWarnings
 1160
 1161            };
 1162            string? metadataURL = metadataLocator.LocateMetadataForRemoteFileAsync(tabularDataURL).Result;
 163
 1164            if (metadataURL is not null)
 165            {
 1166                JObject? descriptorObject = ObjectPropertyUtilityClass.GetDescriptor(metadataURL);
 1167                if (descriptorObject is not null)
 168                {
 1169                    HandleMetadataFoundCase(metadataURL, descriptorObject, validationDetails);
 170                }
 171                else
 172                {
 0173                    validationDetails.GeneralErrors.Add(ErrorFactory.GetMetadataFileCouldNotBeLoadedError(metadataURL));
 174                }
 175            }
 176            else
 177            {
 1178                ProcessTabularDataFileWithoutMetadata(tabularDataURL, validationDetails);
 179            }
 1180        }
 181        /// <summary>
 182        /// This handles case when metadata file has not been provided and located. We use embedded metadata instead.
 183        /// </summary>
 184        /// <param name="tabularDataFileUrlOrPath"></param>
 185        /// <param name="validationDetails"></param>
 186        void ProcessTabularDataFileWithoutMetadata(string tabularDataFileUrlOrPath, ITableGroupValidationDetail validati
 187        {
 188            try
 189            {
 1190                tabularDataFileUrlOrPath = IRINormalizator.NormalizeIri(tabularDataFileUrlOrPath);
 1191                var tableGroupDescriptor = MetadataUnifier.UnifyTableWithoutMetadata(tabularDataFileUrlOrPath);
 1192                ResultUtility.AddTablesToResult(tableGroupDescriptor, validationDetails);
 193
 1194                FlagsCreator.CreateFlags(tableGroupDescriptor);
 1195                ICompatibilityChecker compatibilityChecker = CompatibilityCheckerFactory.GetCompatibilityChecker();
 1196                compatibilityChecker.CheckSchemesCompatible(tableGroupDescriptor, validationDetails);
 197
 1198                TabluarDataTableGroupValidator tableGroupValidator = new TabluarDataTableGroupValidator(tableGroupDescri
 1199                tableGroupValidator.ValidateTableGroup(validationDetails);
 200
 1201            }
 0202            catch (Error e)
 203            {
 0204                if (validationDetails.TableValidationDetails.Count > 0)
 205                {
 0206                    validationDetails.TableValidationDetails[0].Errors.Add(e);
 207                }
 208                else
 209                {
 0210                    validationDetails.GeneralErrors.Add(e);
 211                }
 0212            }
 213
 1214        }
 215        #endregion
 216
 217        #region Commmon
 218        /// <summary>
 219        /// This handles table group with the descriptor object already downloaded in the previous steps.
 220        /// </summary>
 221        /// <param name="metadataUrlOrPath"></param>
 222        /// <param name="descriptorObject"></param>
 223        /// <param name="validationDetails"></param>
 224        void ProcessTableGroup(string metadataUrlOrPath, JObject descriptorObject, ITableGroupValidationDetail validatio
 225        {
 1226            var tableGroupDescriptor = MetadataParserValidator.ProcessTableGroup(
 1227                            validationDetails.GeneralWarnings, metadataUrlOrPath, descriptorObject);
 1228            MetadataUnifier.UnifyTableGroup(tableGroupDescriptor);
 1229            ResultUtility.AddTablesToResult(tableGroupDescriptor, validationDetails);
 230
 1231            FlagsCreator.CreateFlags(tableGroupDescriptor);
 1232            ICompatibilityChecker compatibilityChecker = CompatibilityCheckerFactory.GetCompatibilityChecker();
 1233            compatibilityChecker.CheckSchemesCompatible(tableGroupDescriptor, validationDetails);
 234
 1235            TabluarDataTableGroupValidator tableGroupValidator = new TabluarDataTableGroupValidator(tableGroupDescriptor
 1236            tableGroupValidator.ValidateTableGroup(validationDetails);
 1237        }
 238        /// <summary>
 239        /// This handles table with the descriptor object already downloaded in the previous steps.
 240        /// </summary>
 241        /// <param name="metadataUrlOrPath"></param>
 242        /// <param name="descriptorObject"></param>
 243        /// <param name="validationDetails"></param>
 244        void ProcessTable(string metadataUrlOrPath, JObject descriptorObject, ITableGroupValidationDetail validationDeta
 245        {
 246            // the metadata descriptor is Table
 1247            var tableDescriptor = MetadataParserValidator.ProcessTableFromJObject(validationDetails.GeneralWarnings, des
 1248            var tableGroupDescriptor = MetadataUnifier.UnifyTable(tableDescriptor);
 1249            ResultUtility.AddTablesToResult(tableGroupDescriptor, validationDetails);
 250
 1251            FlagsCreator.CreateFlags(tableGroupDescriptor);
 1252            ICompatibilityChecker compatibilityChecker = CompatibilityCheckerFactory.GetCompatibilityChecker();
 1253            compatibilityChecker.CheckSchemesCompatible(tableGroupDescriptor, validationDetails);
 254
 1255            TabluarDataTableGroupValidator tableGroupValidator = new TabluarDataTableGroupValidator(tableGroupDescriptor
 1256            tableGroupValidator.ValidateTableGroup(validationDetails);
 257
 1258        }
 259        /// <summary>
 260        /// Handles non-overriding cases when the metadata file could be found and loaded.
 261        /// </summary>
 262        /// <param name="metadataUrlOrPath"></param>
 263        /// <param name="descriptorObject"></param>
 264        /// <param name="validationDetails"></param>
 265        void HandleMetadataFoundCase(string metadataUrlOrPath, JObject descriptorObject, ITableGroupValidationDetail val
 266        {
 1267            validationDetails.MetadataIRI = metadataUrlOrPath;
 1268            if (JsonUtilityClass.IsObjectTableGroupDescriptor(descriptorObject))
 269            {
 270                // the metadata descriptor is TableGroup
 1271                ProcessTableGroup(metadataUrlOrPath, descriptorObject, validationDetails);
 272            }
 273            else
 274            {
 1275                ProcessTable(metadataUrlOrPath, descriptorObject, validationDetails);
 276            }
 1277        }
 278        #endregion
 279
 280        #region Overriding
 281        void ProcessOverridingUnsafe(string metadataIRI, ITableGroupValidationDetail validationDetails, params string[] 
 282        {
 1283            JObject? descriptorObject = ObjectPropertyUtilityClass.GetDescriptor(metadataIRI);
 1284            if (descriptorObject is not null)
 285            {
 1286                if (JsonUtilityClass.IsObjectTableGroupDescriptor(descriptorObject))
 287                {
 1288                    ProcessTableGroupOR(metadataIRI, validationDetails, tabularDataIRIs);
 289                }
 290                else
 291                {
 1292                    if (tabularDataIRIs.Length == 1)
 1293                        ProcessTableOR(metadataIRI, validationDetails, tabularDataIRIs[0]);
 294                    else
 295                    {
 0296                        validationDetails.GeneralErrors.Add(ErrorFactory.GetWrongNumberOfTabularIRIsProvidedError(tabula
 297                    }
 298                }
 299            }
 300            else
 301            {
 0302                validationDetails.GeneralErrors.Add(ErrorFactory.GetMetadataFileCouldNotBeLoadedError(metadataIRI));
 303            }
 0304        }
 305        void ProcessTableOR(string metadataIRI, ITableGroupValidationDetail validationDetails, string tabularDataIRI)
 306        {
 1307            JObject? descriptorObject = ObjectPropertyUtilityClass.GetDescriptor(metadataIRI);
 1308            metadataIRI = IRINormalizator.NormalizeIri(metadataIRI);
 1309            tabularDataIRI = IRINormalizator.NormalizeIri(tabularDataIRI);
 1310            if (descriptorObject is not null)
 311            {
 1312                descriptorObject["url"] = tabularDataIRI;
 1313                ProcessTable(metadataIRI, descriptorObject, validationDetails);
 314            }
 315            else
 316            {
 0317                validationDetails.GeneralErrors.Add(ErrorFactory.GetMetadataFileCouldNotBeLoadedError(metadataIRI));
 318            }
 0319        }
 320        void ProcessTableGroupOR(string metadataIRI, ITableGroupValidationDetail validationDetails, params string[] tabu
 321        {
 1322            JObject? descriptorObject = ObjectPropertyUtilityClass.GetDescriptor(metadataIRI);
 323
 1324            if (descriptorObject is not null)
 325            {
 1326                if (descriptorObject.ContainsKey("tables") && descriptorObject["tables"]!.Type == JTokenType.Array)
 327                {
 328
 1329                    ProcessCorrectDescriptorOverridingMetadata(metadataIRI, validationDetails, tabularDataIRIs, descript
 330                }
 331                else
 332                {
 0333                    ProcessTableGroup(metadataIRI, descriptorObject, validationDetails);
 334                }
 335            }
 336            else
 337            {
 0338                validationDetails.GeneralErrors.Add(ErrorFactory.GetMetadataFileCouldNotBeLoadedError(metadataIRI));
 339            }
 0340        }
 341
 342        /// <summary>
 343        /// This manually sets the references from the metadata table group descriptor to the overriding tables user pro
 344        /// </summary>
 345        /// <param name="tabularDataIRIs"></param>
 346        /// <param name="tables"></param>
 347        void ReplaceTabularDataIRIsInTableDescriptions(string[] tabularDataIRIs, JArray tables)
 348        {
 1349            for (int i = 0; i < tabularDataIRIs.Length; i++)
 350            {
 1351                tables[i]["url"] = IRINormalizator.IsAbsoluteUrl(tabularDataIRIs[i]) ? IRINormalizator.NormalizeIri(tabu
 352            }
 1353        }
 354        /// <summary>
 355        /// This transforms the case of overriding metadata to not overriding case as we just add the references to tabu
 356        /// to the tablegroup description ourselves.
 357        /// </summary>
 358        /// <param name="metadataIRI"></param>
 359        /// <param name="validationDetails"></param>
 360        /// <param name="tabularDataIRIs"></param>
 361        /// <param name="descriptorObject"></param>
 362        void ProcessCorrectDescriptorOverridingMetadata(string metadataIRI, ITableGroupValidationDetail validationDetail
 363        {
 1364            var tables = (JArray)descriptorObject["tables"]!;
 1365            if (tabularDataIRIs.Length == tables.Count)
 366            {
 1367                ReplaceTabularDataIRIsInTableDescriptions(tabularDataIRIs, tables);
 1368                ProcessTableGroup(metadataIRI, descriptorObject, validationDetails);
 369            }
 370            else
 371            {
 0372                validationDetails.GeneralErrors.Add(ErrorFactory.GetUserMetadataTablesIrisMismatchMetdataError(tabularDa
 373            }
 0374        }
 375
 376        #endregion
 377    }
 378}