@knora/api
Version:
JavaScript library that handles API requests to Knora
355 lines • 18.2 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
var rxjs_1 = require("rxjs");
var operators_1 = require("rxjs/operators");
var Constants_1 = require("../Constants");
var resource_property_definition_1 = require("../ontologies/resource-property-definition");
var count_query_response_1 = require("../search/count-query-response");
var read_resource_1 = require("./read/read-resource");
var read_boolean_value_1 = require("./values/read/read-boolean-value");
var read_color_value_1 = require("./values/read/read-color-value");
var read_date_value_1 = require("./values/read/read-date-value");
var read_decimal_value_1 = require("./values/read/read-decimal-value");
var read_file_value_1 = require("./values/read/read-file-value");
var read_geom_value_1 = require("./values/read/read-geom-value");
var read_geoname_value_1 = require("./values/read/read-geoname-value");
var read_int_value_1 = require("./values/read/read-int-value");
var read_interval_value_1 = require("./values/read/read-interval-value");
var read_link_value_1 = require("./values/read/read-link-value");
var read_list_value_1 = require("./values/read/read-list-value");
var read_text_value_1 = require("./values/read/read-text-value");
var read_uri_value_1 = require("./values/read/read-uri-value");
var read_value_1 = require("./values/read/read-value");
var ResourcesConversionUtil;
(function (ResourcesConversionUtil) {
/**
* Given a JSON-LD representing zero, one more resources, converts it to an array of ReadResource.
*
* JSON-LD is expected to have expanded prefixes (processed by jsonld processor).
*
* @param resourcesJsonld a JSON-LD object with expanded prefixes representing zero, one or more resources.
* @param ontologyCache instance of OntologyCache to be used.
* @param listNodeCache instance of ListNodeCache to be used.
* @param jsonConvert instance of JsonConvert to be used.
*/
ResourcesConversionUtil.createReadResourceSequence = function (resourcesJsonld, ontologyCache, listNodeCache, jsonConvert) {
if (resourcesJsonld.hasOwnProperty("@graph")) {
// sequence of resources
return rxjs_1.forkJoin(resourcesJsonld["@graph"]
.map(function (res) { return createReadResource(res, ontologyCache, listNodeCache, jsonConvert); }));
}
else {
// one or no resource
if (Object.keys(resourcesJsonld).length === 0) {
return rxjs_1.of([]);
}
else {
return rxjs_1.forkJoin([createReadResource(resourcesJsonld, ontologyCache, listNodeCache, jsonConvert)]);
}
}
};
/**
* Creates a single ReadResource.
*
* @param resourceJsonld a JSON-LD object representing a single resource.
* @param ontologyCache instance of OntologyCache to be used.
* @param listNodeCache instance of ListNodeCache to be used.
* @param jsonConvert instance of JsonConvert to be used.
*/
var createReadResource = function (resourceJsonld, ontologyCache, listNodeCache, jsonConvert) {
if (Array.isArray(resourceJsonld))
throw new Error("resource is expected to be a single object");
var resource = jsonConvert.deserialize(resourceJsonld, read_resource_1.ReadResource);
return ontologyCache.getResourceClassDefinition(resource.type).pipe(operators_1.mergeMap(function (entitiyDefs) {
var resourceProps = Object.keys(resourceJsonld)
.filter(function (propIri) {
return entitiyDefs.properties[propIri] instanceof resource_property_definition_1.ResourcePropertyDefinition;
});
// add information from ontology
resource.resourceClassLabel = entitiyDefs.classes[resource.type].label;
resource.resourceClassComment = entitiyDefs.classes[resource.type].comment;
resource.entityInfo = entitiyDefs;
if (resourceProps.length > 0) {
var values_1 = [];
resourceProps.forEach(function (propIri) {
if (Array.isArray(resourceJsonld[propIri])) {
for (var _i = 0, _a = resourceJsonld[propIri]; _i < _a.length; _i++) {
var value = _a[_i];
values_1.push(createValueValue(propIri, value, entitiyDefs, ontologyCache, listNodeCache, jsonConvert));
}
}
else {
values_1.push(createValueValue(propIri, resourceJsonld[propIri], entitiyDefs, ontologyCache, listNodeCache, jsonConvert));
}
});
return rxjs_1.forkJoin(values_1).pipe(operators_1.map(function (vals) {
// get link values
var linkVals = vals.filter(function (val) {
return val instanceof read_link_value_1.ReadLinkValue;
});
// incoming references with embedded resource
var incomingRefs = linkVals.filter(function (linkVal) {
return linkVal.incoming && linkVal.linkedResource !== undefined;
});
// outgoing references with embedded resource
var outgoingRefs = linkVals.filter(function (linkVal) {
return !linkVal.incoming && linkVal.linkedResource !== undefined;
});
// create a map structure property Iri -> values
var propMap = {};
vals.forEach(function (val) {
if (!propMap.hasOwnProperty(val.property)) {
propMap[val.property] = [val];
}
else {
propMap[val.property].push(val);
}
});
// assign values
resource.properties = propMap;
resource.incomingReferences = incomingRefs.map(function (linkVal) { return linkVal.linkedResource; });
resource.outgoingReferences = outgoingRefs.map(function (linkVal) { return linkVal.linkedResource; });
return resource;
}));
}
else {
return rxjs_1.of(resource);
}
}));
};
/**
* Converts a simple value serialized as JSON-LD to a `ReadValue`.
*
* @param valueJsonld value as JSON-LD to be converted.
* @param dataType the specific value type to convert to.
* @param jsonConvert the converter to be used.
*/
var handleSimpleValue = function (valueJsonld, dataType, jsonConvert) {
return rxjs_1.of(jsonConvert.deserialize(valueJsonld, dataType));
};
/**
* Converts a text value serialized as JSON-LD to a `ReadTextValue`.
*
* @param valueJsonld text value as JSON-LD to be converted.
* @param jsonConvert jsonConvert the converter to be used.
*/
var handleTextValue = function (valueJsonld, jsonConvert) {
if (valueJsonld.hasOwnProperty(Constants_1.Constants.ValueAsString)) {
// TODO: query standoff, if any.
var textValue = jsonConvert.deserialize(valueJsonld, read_text_value_1.ReadTextValueAsString);
return rxjs_1.of(textValue);
}
else if (valueJsonld.hasOwnProperty(Constants_1.Constants.TextValueAsXml)) {
var textValue = jsonConvert.deserialize(valueJsonld, read_text_value_1.ReadTextValueAsXml);
return rxjs_1.of(textValue);
}
else if (valueJsonld.hasOwnProperty(Constants_1.Constants.TextValueAsHtml)) {
var textValue = jsonConvert.deserialize(valueJsonld, read_text_value_1.ReadTextValueAsHtml);
return rxjs_1.of(textValue);
}
else {
throw new Error("Invalid Text value");
}
};
/**
* Converts a link value serialized as JSON-LD to a `ReadTextValue`.
*
* @param valueJsonld link value as JSON-LD to be converted.
* @param ontologyCache instance of `OntologyCache` to be used.
* @param listNodeCache instance of ListNodeCache to be used.
* @param jsonConvert jsonConvert the converter to be used.
*/
var handleLinkValue = function (valueJsonld, ontologyCache, listNodeCache, jsonConvert) {
var linkValue = jsonConvert.deserialize(valueJsonld, read_link_value_1.ReadLinkValue);
var handleLinkedResource = function (linkedResource, incoming) {
var referredRes = createReadResource(linkedResource, ontologyCache, listNodeCache, jsonConvert);
return referredRes.pipe(operators_1.map(function (refRes) {
linkValue.linkedResource = refRes;
linkValue.linkedResourceIri = refRes.id;
linkValue.incoming = incoming;
return linkValue;
}));
};
var handleLinkedResourceIri = function (linkedResourceIri, incoming) {
if (linkedResourceIri === undefined)
throw new Error("Invalid resource Iri");
linkValue.linkedResourceIri = linkedResourceIri;
linkValue.incoming = incoming;
return rxjs_1.of(linkValue);
};
// check if linked resource is nested or if just its IRI is present
if (valueJsonld.hasOwnProperty(Constants_1.Constants.LinkValueHasTarget)) {
return handleLinkedResource(valueJsonld[Constants_1.Constants.LinkValueHasTarget], false);
}
else if (valueJsonld.hasOwnProperty(Constants_1.Constants.LinkValueHasTargetIri)) {
// TODO: check for existence of @id
return handleLinkedResourceIri(valueJsonld[Constants_1.Constants.LinkValueHasTargetIri]["@id"], false);
}
else if (valueJsonld.hasOwnProperty(Constants_1.Constants.LinkValueHasSource)) {
return handleLinkedResource(valueJsonld[Constants_1.Constants.LinkValueHasSource], true);
}
else if (valueJsonld.hasOwnProperty(Constants_1.Constants.LinkValueHasSourceIri)) {
// TODO: check for existence of @id
return handleLinkedResourceIri(valueJsonld[Constants_1.Constants.LinkValueHasSourceIri]["@id"], true);
}
else {
throw new Error("Invalid Link Value");
}
};
/**
* Creates a single ReadValue.
*
* @param propIri Iri of the property pointing to the value.
* @param valueJsonld JSON-LD object representing a single value.
* @param entitiyDefs entity definitions for the given value type.
* @param ontologyCache instance of OntologyCache to be used.
* @param listNodeCache instance of ListNodeCache to be used.
* @param jsonConvert instance of JsonConvert to be used.
*/
var createValueValue = function (propIri, valueJsonld, entitiyDefs, ontologyCache, listNodeCache, jsonConvert) {
if (Array.isArray(valueJsonld))
throw new Error("value is expected to be a single object");
var type = valueJsonld["@type"];
var value;
switch (type) {
case Constants_1.Constants.BooleanValue: {
var boolVal = handleSimpleValue(valueJsonld, read_boolean_value_1.ReadBooleanValue, jsonConvert);
value = boolVal.pipe(operators_1.map(function (val) {
val.strval = val.bool ? "TRUE" : "FALSE";
return val;
}));
break;
}
case Constants_1.Constants.ColorValue: {
var colorVal = handleSimpleValue(valueJsonld, read_color_value_1.ReadColorValue, jsonConvert);
value = colorVal.pipe(operators_1.map(function (val) {
val.strval = val.color;
return val;
}));
break;
}
case Constants_1.Constants.DateValue: {
var dateVal = handleSimpleValue(valueJsonld, read_date_value_1.ParseReadDateValue, jsonConvert);
value = dateVal.pipe(operators_1.map(function (val) {
return new read_date_value_1.ReadDateValue(val);
}));
break;
}
case Constants_1.Constants.IntValue: {
var intVal = handleSimpleValue(valueJsonld, read_int_value_1.ReadIntValue, jsonConvert);
value = intVal.pipe(operators_1.map(function (val) {
val.strval = val.int.toString();
return val;
}));
break;
}
case Constants_1.Constants.DecimalValue: {
var decimalVal = handleSimpleValue(valueJsonld, read_decimal_value_1.ReadDecimalValue, jsonConvert);
value = decimalVal.pipe(operators_1.map(function (val) {
val.strval = val.decimal.toString();
return val;
}));
break;
}
case Constants_1.Constants.IntervalValue: {
var intervalVal = handleSimpleValue(valueJsonld, read_interval_value_1.ReadIntervalValue, jsonConvert);
value = intervalVal.pipe(operators_1.map(function (val) {
val.strval = val.start.toString() + " - " + val.end.toString();
return val;
}));
break;
}
case Constants_1.Constants.ListValue: {
var listValue = value = handleSimpleValue(valueJsonld, read_list_value_1.ReadListValue, jsonConvert);
value = listValue.pipe(operators_1.mergeMap(function (listVal) {
// get referred list node's label
return listNodeCache.getNode(listVal.listNode).pipe(operators_1.map(function (listNode) {
listVal.listNodeLabel = listNode.label;
listVal.strval = listNode.label;
return listVal;
}));
}));
break;
}
case Constants_1.Constants.UriValue: {
var uriVal = handleSimpleValue(valueJsonld, read_uri_value_1.ReadUriValue, jsonConvert);
value = uriVal.pipe(operators_1.map(function (val) {
val.strval = val.uri;
return val;
}));
break;
}
case Constants_1.Constants.TextValue: {
var textVal = handleTextValue(valueJsonld, jsonConvert);
value = textVal.pipe(operators_1.map(function (val) {
if (val instanceof read_text_value_1.ReadTextValueAsString) {
val.strval = val.text;
}
else if (val instanceof read_text_value_1.ReadTextValueAsXml) {
val.strval = val.xml;
}
else if (val instanceof read_text_value_1.ReadTextValueAsHtml) {
val.strval = val.html;
}
else {
console.error("String representation for a ReadTextValue could not be constructed for: ", type);
}
return val;
}));
break;
}
case Constants_1.Constants.LinkValue: {
var linkVal = handleLinkValue(valueJsonld, ontologyCache, listNodeCache, jsonConvert);
value = linkVal.pipe(operators_1.map(function (val) {
val.strval = val.linkedResourceIri;
return val;
}));
break;
}
case Constants_1.Constants.GeomValue: {
var geomVal = handleSimpleValue(valueJsonld, read_geom_value_1.ParseReadGeomValue, jsonConvert);
value = geomVal.pipe(operators_1.map(function (geom) {
return new read_geom_value_1.ReadGeomValue(geom);
}));
break;
}
case Constants_1.Constants.StillImageFileValue: {
var stillImageVal = handleSimpleValue(valueJsonld, read_file_value_1.ReadStillImageFileValue, jsonConvert);
value = stillImageVal.pipe(operators_1.map(function (val) {
val.strval = val.fileUrl;
return val;
}));
break;
}
case Constants_1.Constants.GeonameValue: {
var geonameVal = handleSimpleValue(valueJsonld, read_geoname_value_1.ReadGeonameValue, jsonConvert);
value = geonameVal.pipe(operators_1.map(function (val) {
val.strval = val.geoname;
return val;
}));
break;
}
default: {
console.error("Unknown value type: ", type);
value = rxjs_1.of(jsonConvert.deserialize(valueJsonld, read_value_1.ReadValue));
}
}
return value.pipe(operators_1.map(function (val) {
val.property = propIri;
val.propertyLabel = entitiyDefs.properties[propIri].label;
val.propertyComment = entitiyDefs.properties[propIri].comment;
return val;
}));
};
/**
* Creates a response to a count query.
* @param countQueryResult the result of the count query.
* @param jsonConvert the instance of jsonConvert to be used.
*/
ResourcesConversionUtil.createCountQueryResponse = function (countQueryResult, jsonConvert) {
if (Array.isArray(countQueryResult))
throw new Error("countQueryResult is expected to be a single object");
return jsonConvert.deserialize(countQueryResult, count_query_response_1.CountQueryResponse);
};
})(ResourcesConversionUtil = exports.ResourcesConversionUtil || (exports.ResourcesConversionUtil = {}));
//# sourceMappingURL=ResourcesConversionUtil.js.map