diff --git a/src/Tree/App.config b/src/Tree/App.config index 20153e8bb3f89ce37e61a2706c333add291e8062..f2d19a6d513cbc67c959d2b5e76393af1971564c 100644 --- a/src/Tree/App.config +++ b/src/Tree/App.config @@ -149,7 +149,7 @@ </dependentAssembly> <dependentAssembly> <assemblyIdentity name="Coscine.Database" publicKeyToken="767d77427707b70a" culture="neutral" /> - <bindingRedirect oldVersion="0.0.0.0-1.27.0.0" newVersion="1.27.0.0" /> + <bindingRedirect oldVersion="0.0.0.0-1.28.0.0" newVersion="1.28.0.0" /> </dependentAssembly> <dependentAssembly> <assemblyIdentity name="Microsoft.Extensions.Options" publicKeyToken="adb9793829ddae60" culture="neutral" /> @@ -205,7 +205,11 @@ </dependentAssembly> <dependentAssembly> <assemblyIdentity name="Coscine.Database.T4" publicKeyToken="84b4c404a0696261" culture="neutral" /> - <bindingRedirect oldVersion="0.0.0.0-1.27.0.0" newVersion="1.27.0.0" /> + <bindingRedirect oldVersion="0.0.0.0-1.28.0.0" newVersion="1.28.0.0" /> + </dependentAssembly> + <dependentAssembly> + <assemblyIdentity name="Coscine.Logging" publicKeyToken="e1ed402bc3f6525e" culture="neutral" /> + <bindingRedirect oldVersion="0.0.0.0-1.3.0.0" newVersion="1.3.0.0" /> </dependentAssembly> </assemblyBinding> </runtime> diff --git a/src/Tree/Controllers/TreeController.cs b/src/Tree/Controllers/TreeController.cs index 71f74886ae41b44a9bd0c47ac0cbdeb62c6a7820..2d0d7a063852b0b2f79c3e61674b14807e73c6fc 100644 --- a/src/Tree/Controllers/TreeController.cs +++ b/src/Tree/Controllers/TreeController.cs @@ -145,7 +145,32 @@ namespace Coscine.Api.Tree.Controllers )) ); - LogAnalytics("View MD", resourceId, path, user); + if (resource.ApplicationProfile[resource.ApplicationProfile.Length - 1] != '/') + { + resource.ApplicationProfile += '/'; + } + string metadataCompleteness = null; + try + { + JToken metadata; + if (jObject.SelectToken("data").SelectToken("metadataStorage").Count() > 0) + { + metadata = jObject.SelectToken("data").SelectToken("metadataStorage").First.First.First; + } + else + { + metadata = jObject.SelectToken("data").SelectToken("metadataStorage"); + } + + var shapesGraph = (Graph)_rdfStoreConnector.GetGraph(resource.ApplicationProfile); + metadataCompleteness = GetMetadataCompleteness(metadata, shapesGraph); + } + catch (Exception e) + { + metadataCompleteness = "Error"; + } + + LogAnalytics("Update MD", resourceId, path, user, metadataCompleteness); return Json(jObject); } catch @@ -258,12 +283,12 @@ namespace Coscine.Api.Tree.Controllers if (_rdfStoreConnector.HasGraph(graphNameUri)) { _rdfStoreConnector.ClearGraph(graphNameUri); - LogAnalytics("Update MD", resourceId, path, user); + LogAnalytics("Update MD", resourceId, path, user, GetMetadataCompleteness(innerBlock, shapesGraph)); } else { _rdfStoreConnector.CreateNamedGraph(graphNameUri); - LogAnalytics("Upload MD", resourceId, path, user); + LogAnalytics("Upload MD", resourceId, path, user, GetMetadataCompleteness(innerBlock, shapesGraph)); } // BaseUri must be set for the sparql query @@ -330,7 +355,8 @@ namespace Coscine.Api.Tree.Controllers /// <param name="resourceId">Resource of the id</param> /// <param name="filename">Name of the file</param> /// <param name="user">User object</param> - private void LogAnalytics(string operation, string resourceId, string filename, User user) + /// <param name="metadataCompleteness">Metadata Completeness</param> + private void LogAnalytics(string operation, string resourceId, string filename, User user, string metadataCompleteness = null) { if (CoscineLoggerConfiguration.IsLogLevelActivated(LogType.Analytics)) { @@ -340,8 +366,27 @@ namespace Coscine.Api.Tree.Controllers _analyticsLogObject.ResourceId = resourceId; _analyticsLogObject.ProjectId = _projectResourceModel.GetProjectForResource(new Guid(resourceId)).ToString(); _analyticsLogObject.RoleId = _projectRoleModel.GetGetUserRoleForProject(new Guid(_analyticsLogObject.ProjectId), user.Id).ToString(); + _analyticsLogObject.ApplicationsProfile = _resourceModel.CreateReturnObjectFromDatabaseObject(_resourceModel.GetById(new Guid(resourceId))).ApplicationProfile; + _analyticsLogObject.MetadataCompleteness = metadataCompleteness; _coscineLogger.AnalyticsLog(_analyticsLogObject); } } + + /// <summary> + /// Gets metadata completeness by comparing submitted values to the application profile specific shape graph + /// </summary> + /// <param name="valueTokens"></param> + /// <param name="shapesGraph"></param> + /// <returns></returns> + private string GetMetadataCompleteness (JToken valueTokens, IGraph shapesGraph) + { + NodeFactory nodeFactory = new NodeFactory(); + UriNode uriNode = (UriNode)nodeFactory.CreateUriNode(new Uri("http://www.w3.org/ns/shacl#property")); + + int total = shapesGraph.GetTriplesWithPredicate(uriNode).Count(); + int present = valueTokens.Count(); + + return $"{present}/{total}"; + } } } diff --git a/src/Tree/Tree.csproj b/src/Tree/Tree.csproj index 5d3b7b847a6ef763123d28ce3501e2c4a1277f09..fdd1ec3bc6625abe5d5cd3f7ac164923d0357308 100644 --- a/src/Tree/Tree.csproj +++ b/src/Tree/Tree.csproj @@ -56,17 +56,17 @@ <Reference Include="Coscine.Configuration, Version=1.5.0.0, Culture=neutral, PublicKeyToken=ce3d7a32d7dc1e5a, processorArchitecture=MSIL"> <HintPath>..\packages\Coscine.Configuration.1.5.0\lib\net461\Coscine.Configuration.dll</HintPath> </Reference> - <Reference Include="Coscine.Database, Version=1.27.0.0, Culture=neutral, PublicKeyToken=767d77427707b70a, processorArchitecture=MSIL"> - <HintPath>..\packages\Coscine.Database.1.27.0\lib\net461\Coscine.Database.dll</HintPath> + <Reference Include="Coscine.Database, Version=1.28.0.0, Culture=neutral, PublicKeyToken=767d77427707b70a, processorArchitecture=MSIL"> + <HintPath>..\packages\Coscine.Database.1.28.0-topic-1221-loggi0005\lib\net461\Coscine.Database.dll</HintPath> </Reference> - <Reference Include="Coscine.Database.T4, Version=1.27.0.0, Culture=neutral, PublicKeyToken=84b4c404a0696261, processorArchitecture=MSIL"> - <HintPath>..\packages\Coscine.Database.1.27.0\lib\net461\Coscine.Database.T4.dll</HintPath> + <Reference Include="Coscine.Database.T4, Version=1.28.0.0, Culture=neutral, PublicKeyToken=84b4c404a0696261, processorArchitecture=MSIL"> + <HintPath>..\packages\Coscine.Database.1.28.0-topic-1221-loggi0005\lib\net461\Coscine.Database.T4.dll</HintPath> </Reference> <Reference Include="Coscine.JwtHandler, Version=1.2.0.0, Culture=neutral, PublicKeyToken=aaacf41df3a6253c, processorArchitecture=MSIL"> <HintPath>..\packages\Coscine.JwtHandler.1.2.0\lib\net461\Coscine.JwtHandler.dll</HintPath> </Reference> - <Reference Include="Coscine.Logging, Version=1.2.0.0, Culture=neutral, PublicKeyToken=e1ed402bc3f6525e, processorArchitecture=MSIL"> - <HintPath>..\packages\Coscine.Logging.1.2.0\lib\net461\Coscine.Logging.dll</HintPath> + <Reference Include="Coscine.Logging, Version=1.3.0.0, Culture=neutral, PublicKeyToken=e1ed402bc3f6525e, processorArchitecture=MSIL"> + <HintPath>..\packages\Coscine.Logging.1.3.0-topic-1221-loggi0001\lib\net461\Coscine.Logging.dll</HintPath> </Reference> <Reference Include="Coscine.Metadata, Version=1.5.0.0, Culture=neutral, processorArchitecture=MSIL"> <HintPath>..\packages\Coscine.Metadata.1.5.0\lib\net461\Coscine.Metadata.dll</HintPath> diff --git a/src/Tree/packages.config b/src/Tree/packages.config index 5cb7fddecdda4bba26eabe31e768648b51835b53..34afa10345ad0c278914f627bc8ff693ee4dbc29 100644 --- a/src/Tree/packages.config +++ b/src/Tree/packages.config @@ -3,9 +3,9 @@ <package id="Consul" version="0.7.2.6" targetFramework="net461" /> <package id="Coscine.ApiCommons" version="1.11.0" targetFramework="net461" /> <package id="Coscine.Configuration" version="1.5.0" targetFramework="net461" /> - <package id="Coscine.Database" version="1.27.0" targetFramework="net461" /> + <package id="Coscine.Database" version="1.28.0-topic-1221-loggi0005" targetFramework="net461" /> <package id="Coscine.JwtHandler" version="1.2.0" targetFramework="net461" /> - <package id="Coscine.Logging" version="1.2.0" targetFramework="net461" /> + <package id="Coscine.Logging" version="1.3.0-topic-1221-loggi0001" targetFramework="net461" /> <package id="Coscine.Metadata" version="1.5.0" targetFramework="net461" /> <package id="Coscine.ResourceConfiguration" version="1.3.0" targetFramework="net461" /> <package id="Coscine.ResourceLoader" version="1.2.0" targetFramework="net461" />