UNPKG

@dasch-swiss/dsp-js

Version:

JavaScript library that handles API requests to Knora

283 lines 15.3 kB
import { Constants } from "../Constants"; import { OntologiesMetadata, OntologyMetadata } from "./ontology-metadata"; import { ReadOntology } from "./read/read-ontology"; import { ResourceClassDefinition, ResourceClassDefinitionWithAllLanguages } from "./resource-class-definition"; import { ResourcePropertyDefinition, ResourcePropertyDefinitionWithAllLanguages } from "./resource-property-definition"; import { StandoffClassDefinition, StandoffClassDefinitionWithAllLanguages } from "./standoff-class-definition"; import { SystemPropertyDefinition, SystemPropertyDefinitionWithAllLanguages } from "./system-property-definition"; /** * @category Internal */ export var OntologyConversionUtil; (function (OntologyConversionUtil) { /** * Given a Knora entity IRI, gets the ontology Iri. * External entity Iris are ignored. * * @param entityIri an entity Iri. * @param knoraApiConfig the Knora api configuration. * @return the ontology IRI as the only entry in an array, otherwise an empty array. */ OntologyConversionUtil.getOntologyIriFromEntityIri = function (entityIri, knoraApiConfig) { var ontologyIri = []; // set `http` regardless of knoraApiConfig.apiProtocol // include port only when running locally var projectEntityBase = "http://" + knoraApiConfig.apiHost; if (knoraApiConfig.apiPort !== null && (knoraApiConfig.apiHost === "localhost" || knoraApiConfig.apiHost === "0.0.0.0")) { projectEntityBase = projectEntityBase + ":" + knoraApiConfig.apiPort; } projectEntityBase = projectEntityBase + "/ontology/"; // Check if the given entity Iri belongs to knora-api or a project ontology. // Ignore external entity Iris. if (entityIri.indexOf(Constants.KnoraApiV2) === 0) { ontologyIri.push(Constants.KnoraApiV2); } else if (entityIri.indexOf(projectEntityBase) === 0) { // split entity Iri on "#" var segments = entityIri.split(Constants.HashDelimiter); if (segments.length === 2) { // First segment identifies the project ontology the entity belongs to. ontologyIri.push(segments[0]); } else { console.error("Error: ".concat(entityIri, " is not a valid Knora entity IRI.")); } } return ontologyIri; }; /** * Determines resource class definitions when passed to filter() applied to an array of entity definitions. * * @param entity the entity definition to be analyzed. */ OntologyConversionUtil.filterResourceClassDefinitions = function (entity) { return entity.hasOwnProperty(Constants.IsResourceClass) && entity[Constants.IsResourceClass] === true; }; /** * Determines standoff class definitions when passed to filter() applied to an array of entity definitions. * * @param entity the entity definition to be analyzed. */ OntologyConversionUtil.filterStandoffClassDefinitions = function (entity) { return entity.hasOwnProperty(Constants.IsStandoffClass) && entity[Constants.IsStandoffClass] === true; }; /** * Determines resource property definitions when passed to filter() applied to an array of entity definitions. * * @param entity the entity definition to be analyzed. */ OntologyConversionUtil.filterResourcePropertyDefinitions = function (entity) { return entity.hasOwnProperty(Constants.IsResourceProperty) && entity[Constants.IsResourceProperty] === true; }; /** * Determines system property definitions when passed to filter() applied to an array of entity definitions. * * @param entity the entity definition to be analyzed. */ OntologyConversionUtil.filterSystemPropertyDefintions = function (entity) { return (entity["@type"] === Constants.DataTypeProperty || entity["@type"] === Constants.ObjectProperty) && !entity.hasOwnProperty(Constants.IsResourceProperty); }; /** * Converts an entity definition to the specified type. * * @param entity the entity definition to be converted. * @param dataType the target type of the conversion. * @param jsonConvert the converter to be used. */ OntologyConversionUtil.convertEntity = function (entity, dataType, jsonConvert) { return jsonConvert.deserializeObject(entity, dataType); }; /** * Given an array of entities, converts and adds them to the given ontology. * * @param ontology the ontology to which the definitions should be added. * @param entities the entities to be converted and added. * @param jsonConvert instance of JsonConvert to be used. */ var convertAndAddEntityDefinitions = function (ontology, entities, jsonConvert) { // Convert resource classes entities.filter(OntologyConversionUtil.filterResourceClassDefinitions).map(function (resclassJsonld) { return OntologyConversionUtil.convertEntity(resclassJsonld, ResourceClassDefinition, jsonConvert); }).forEach(function (resClass) { ontology.classes[resClass.id] = resClass; }); // Convert standoff classes entities.filter(OntologyConversionUtil.filterStandoffClassDefinitions).map(function (standoffclassJsonld) { return OntologyConversionUtil.convertEntity(standoffclassJsonld, StandoffClassDefinition, jsonConvert); }).forEach(function (standoffClass) { ontology.classes[standoffClass.id] = standoffClass; }); // Convert resource properties (properties pointing to Knora values) entities.filter(OntologyConversionUtil.filterResourcePropertyDefinitions).map(function (propertyJsonld) { return OntologyConversionUtil.convertEntity(propertyJsonld, ResourcePropertyDefinition, jsonConvert); }).forEach(function (prop) { ontology.properties[prop.id] = prop; }); // Convert system properties (properties not pointing to Knora values) entities.filter(OntologyConversionUtil.filterSystemPropertyDefintions).map(function (propertyJsonld) { return OntologyConversionUtil.convertEntity(propertyJsonld, SystemPropertyDefinition, jsonConvert); }).forEach(function (prop) { ontology.properties[prop.id] = prop; }); }; /** * Given an array of entities with labels and comments for all languages, * converts and adds them to the given ontology. * * @param ontology the ontology to which the definitions should be added. * @param entities the entities to be converted and added. * @param jsonConvert instance of JsonConvert to be used. */ var convertAndAddEntityDefinitionsWithAllLanguages = function (ontology, entities, jsonConvert) { // Convert resource classes entities.filter(OntologyConversionUtil.filterResourceClassDefinitions).map(function (resclassJsonld) { return OntologyConversionUtil.convertEntity(resclassJsonld, ResourceClassDefinitionWithAllLanguages, jsonConvert); }).forEach(function (resClass) { ontology.classes[resClass.id] = resClass; }); // Convert standoff classes entities.filter(OntologyConversionUtil.filterStandoffClassDefinitions).map(function (standoffclassJsonld) { return OntologyConversionUtil.convertEntity(standoffclassJsonld, StandoffClassDefinitionWithAllLanguages, jsonConvert); }).forEach(function (standoffClass) { ontology.classes[standoffClass.id] = standoffClass; }); // Convert resource properties (properties pointing to Knora values) entities.filter(OntologyConversionUtil.filterResourcePropertyDefinitions).map(function (propertyJsonld) { return OntologyConversionUtil.convertEntity(propertyJsonld, ResourcePropertyDefinitionWithAllLanguages, jsonConvert); }).forEach(function (prop) { ontology.properties[prop.id] = prop; }); // Convert system properties (properties not pointing to Knora values) entities.filter(OntologyConversionUtil.filterSystemPropertyDefintions).map(function (propertyJsonld) { return OntologyConversionUtil.convertEntity(propertyJsonld, SystemPropertyDefinitionWithAllLanguages, jsonConvert); }).forEach(function (prop) { ontology.properties[prop.id] = prop; }); }; /** * Given an ontology, analyzes its direct dependencies and adds them to the given ontology. * * @param ontology the ontology whose direct dependencies should be analyzed. * @param knoraApiConfig the Knora API config to be used. */ var analyzeDirectDependencies = function (ontology, knoraApiConfig) { // Ontologies referenced by this ontology var referencedOntologies = new Set([]); // Collect ontologies referenced by this ontology in resource classes: // references to properties (cardinalities) and resource classes (super classes) for (var index in ontology.classes) { if (ontology.classes.hasOwnProperty(index)) { ontology.classes[index].propertiesList.forEach(function (prop) { OntologyConversionUtil.getOntologyIriFromEntityIri(prop.propertyIndex, knoraApiConfig) .forEach(function (ontoIri) { return referencedOntologies.add(ontoIri); }); }); ontology.classes[index].subClassOf.forEach(function (superClass) { OntologyConversionUtil.getOntologyIriFromEntityIri(superClass, knoraApiConfig) .forEach(function (ontoIri) { return referencedOntologies.add(ontoIri); }); }); } } // Collect ontologies referenced by this ontology in properties: // references to other properties (super properties) and resource classes (subject and object types) for (var index in ontology.properties) { if (ontology.properties.hasOwnProperty(index)) { if (ontology.properties[index].objectType !== undefined) { OntologyConversionUtil.getOntologyIriFromEntityIri(ontology.properties[index].objectType, knoraApiConfig) .forEach(function (ontoIri) { return referencedOntologies.add(ontoIri); }); } if (ontology.properties[index].subjectType !== undefined) { OntologyConversionUtil.getOntologyIriFromEntityIri(ontology.properties[index].subjectType, knoraApiConfig) .forEach(function (ontoIri) { return referencedOntologies.add(ontoIri); }); } ontology.properties[index].subPropertyOf.forEach(function (superProperty) { OntologyConversionUtil.getOntologyIriFromEntityIri(superProperty, knoraApiConfig) .forEach(function (ontoIri) { return referencedOntologies.add(ontoIri); }); }); } } // Remove this ontology from the collection referencedOntologies.delete(ontology.id); ontology.dependsOnOntologies = referencedOntologies; }; /** * Converts an ontology serialized as JSON-LD to an instance of `ReadOntology`. * * @param ontologyJsonld ontology as JSON-LD already processed by the jsonld-processor. * @param jsonConvert instance of JsonConvert to use. * @param knoraApiConfig config object to use. * @param allLanguages indicates if labels and comments were fetched for all languages. * @return the ontology as a `ReadOntology`. */ OntologyConversionUtil.convertOntology = function (ontologyJsonld, jsonConvert, knoraApiConfig, allLanguages) { var ontology = jsonConvert.deserializeObject(ontologyJsonld, ReadOntology); // Access the collection of entities var entities = ontologyJsonld["@graph"]; if (!Array.isArray(entities)) throw new Error("An ontology is expected to have a member '@graph' containing an array of entities"); if (!allLanguages) { convertAndAddEntityDefinitions(ontology, entities, jsonConvert); } else { convertAndAddEntityDefinitionsWithAllLanguages(ontology, entities, jsonConvert); } analyzeDirectDependencies(ontology, knoraApiConfig); return ontology; }; /** * Converts a list of ontologies or a single ontology serialized as JSON-LD to an instance of `OntologiesMetadata` * * @param ontologiesJsonld JSON-LD representing ontology metadata. * @param jsonConvert instance of JsonConvert to use. */ OntologyConversionUtil.convertOntologiesList = function (ontologiesJsonld, jsonConvert) { if (ontologiesJsonld.hasOwnProperty("@graph")) { return jsonConvert.deserializeObject(ontologiesJsonld, OntologiesMetadata); } else { var ontologies = new OntologiesMetadata(); // add ontologies, if any if (Object.keys(ontologiesJsonld).length > 0) { ontologies.ontologies = [jsonConvert.deserializeObject(ontologiesJsonld, OntologyMetadata)]; } return ontologies; } }; /** * Converts the response from createResourceClass serialized as JSON-LD to an instance of `ResourceClassDefinition` * * @param resClassJsonld JSON-LD representing a resource class definition. * @param jsonConvert instance of JsonConvert to use. */ OntologyConversionUtil.convertResourceClassResponse = function (resClassJsonld, jsonConvert) { if (resClassJsonld.hasOwnProperty("@graph")) { var deserializedObj = jsonConvert.deserializeObject(resClassJsonld["@graph"][0], ResourceClassDefinitionWithAllLanguages); deserializedObj.lastModificationDate = (jsonConvert.deserializeObject(resClassJsonld, OntologyMetadata)).lastModificationDate; return deserializedObj; } else { return jsonConvert.deserializeObject(resClassJsonld, ResourceClassDefinitionWithAllLanguages); } }; /** * Converts the response from createResourceProperty serialized as JSON-LD to an instance of `ResourcePropertyDefinition` * * @param resPropJsonld JSON-LD representing a resource property definition. * @param jsonConvert instance of JsonConvert to use. */ OntologyConversionUtil.convertResourcePropertyResponse = function (resPropJsonld, jsonConvert) { if (resPropJsonld.hasOwnProperty("@graph")) { var deserializedObj = jsonConvert.deserializeObject(resPropJsonld["@graph"][0], ResourcePropertyDefinitionWithAllLanguages); deserializedObj.lastModificationDate = (jsonConvert.deserializeObject(resPropJsonld, OntologyMetadata)).lastModificationDate; return deserializedObj; } else { return jsonConvert.deserializeObject(resPropJsonld, ResourcePropertyDefinitionWithAllLanguages); } }; })(OntologyConversionUtil || (OntologyConversionUtil = {})); //# sourceMappingURL=OntologyConversionUtil.js.map