UNPKG

@iotschema/humidity

Version:

undefined

224 lines (205 loc) 5.87 kB
'use strict' /* IPShapeParser.js: ---------------- parses an input iot.schema.org Interaction Pattern (IP) shape and extracts configuration attributes for the given IP node. This code is used to create a Node-RED node for an iot.schema.org IP. */ const sep = require('path').sep; var ids = []; var shapes = []; var shapeJson; function addConfigAttributes(shapej, configj){ shapeJson = shapej; parseShape(shapej); parseConfigAttr(configj); return shapeJson; } function parseShape(data){ // var json = JSON.parse(data); for (var i = 0, j = 0; i < (data['@graph']).length; i++, j++) { shapes[j] = data['@graph'][i]; ids[j] = shapes[j].id; } if (data == null) { console.log("Please provide a SHACL shape as input parameter"); } } var minval; var maxval; var unit = ""; var values = []; var observable; var name = ""; var capability = ""; var foi = ""; function parseConfigAttr(json){ //var json = JSON.parse(data); minval = json["configParams"]["minValue"]; maxval = json["configParams"]["maxValue"]; unit = json["configParams"]["unitCode"]; values = json["configParams"]["propertyValues"]; observable = json["configParams"]["observable"]; name = json["configParams"]["name"]; capability = json["configParams"]["capability"]; foi = json["configParams"]["FeatureOfInterestType"]; ingrateIntoShape(); } function ingrateIntoShape(){ var requiredShape = {}; if(minval !=undefined){ requiredShape = getshape("schema:minValue"); integrateMinConfig(requiredShape, minval); } if(minval !=undefined){ requiredShape = getshape("schema:maxValue"); integrateMaxConfig(requiredShape, maxval); } if(unit !=undefined){ requiredShape = getshape("schema:unitCode"); integrateUnitConfig(requiredShape, unit); } if(observable !=undefined){ requiredShape = getshape("iot:observable"); integrateObservableConfig(requiredShape, observable); } if(capability !=undefined){ for(var m = 0; m < shapes.length; m++){ if(shapes[m]["sh:targetClass"]){ if(!shapes[m]["@id"].includes("Data")){ var temp = {}; temp = shapes[m]; if(name!="") temp["name"] = name; if(capability!=""){ var bn = "_:"+randomString(); temp["sh:and"]["@list"].push({"@id": bn}); integrateCapabilityConfig(bn); } if(foi!=""){ var bn = "_:"+randomString(); var rnode = {}; rnode["@id"] = bn; temp["sh:and"]["@list"].push(rnode); integrateFoiConfig(bn); } delete shapeJson['@graph'].temp; shapeJson['@graph'].push(temp); } } } } /*if(foi !=undefined){ requiredShape = getshape("sh:targetClass"); integrateFoiConfig(requiredShape, foi); }*/ } function randomString() { var charSet = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; var blankNode = ''; for (var i = 0; i < 10; i++) { var randomPoz = Math.floor(Math.random() * charSet.length); blankNode += charSet.substring(randomPoz,randomPoz+1); } return blankNode; } function integrateMinConfig(shape, attr){ var index = shapeJson['@graph'].indexOf(shape); shapeJson['@graph'].splice( index, 1 ); var propTypeNode = getPropertyTypeShape(); delete shapeJson.propTypeNode; propTypeNode["sh:minInclusive"] = {}; propTypeNode["sh:minInclusive"] = attr; shapeJson['@graph'].push(propTypeNode); } function getPropertyTypeShape(){ for(var i = 0; i < shapes.length; i++){ if(shapes[i]["sh:path"]){ if(shapes[i]["sh:path"]["@id"] == "schema:propertyType"){ return shapes[i]; } } } } function integrateMaxConfig(shape, attr){ var index = shapeJson['@graph'].indexOf(shape); shapeJson['@graph'].splice( index, 1 ); var propTypeNode = getPropertyTypeShape(); delete shapeJson['@graph'].propTypeNode; propTypeNode["sh:maxInclusive"] = {}; propTypeNode["sh:maxInclusive"] = attr; shapeJson['@graph'].push(propTypeNode); } function integrateUnitConfig(shape, attr){ var temp = shape; delete shapeJson['@graph'].shape; delete temp["sh:in"]; temp["sh:hasValue"] = attr; shapeJson['@graph'].push(temp); } function integrateObservableConfig(shape, attr){ delete shapeJson['@graph'].shape; delete shape["sh:hasValue"]; shape["sh:hasValue"] = attr; shapeJson['@graph'].push(shape); } function getshape(shapeAttr){ /* for(var m = 0; m < shapes.length; m++){ console.log(shapes[m]); }*/ for(var m = 0; m < shapes.length; m++){ if(shapes[m]["sh:path"]){ if(shapes[m]["sh:path"]["@id"] == shapeAttr){ return shapes[m]; } } } } function integrateCapabilityConfig(bn){ var rnode = {}; var bn2 = "_:"+randomString(); rnode["@id"] = bn; rnode["sh:property"] = {}; rnode["sh:property"]["@id"] = bn2; shapeJson['@graph'].push(rnode); var capNode = {}; capNode["@id"] = bn2; capNode["sh:maxCount"] = 1; capNode["sh:minCount"] = 1; capNode["sh:hasValue"] = capability; capNode["sh:path"] = {}; capNode["sh:path"]["@id"] = "iot:capability"; shapeJson['@graph'].push(capNode); } function integrateFoiConfig(bn){ var rnode = {}; var bn2 = "_:"+randomString(); rnode["@id"] = bn; rnode["sh:property"] = {}; rnode["sh:property"]["@id"] = bn2; shapeJson['@graph'].push(rnode); var capNode = {}; capNode["@id"] = bn2; capNode["sh:maxCount"] = 1; capNode["sh:minCount"] = 1; capNode["sh:path"] = {}; if(observable){ capNode["sh:path"]["@id"] = "iot:isPropertyOf"; capNode["sh:hasValue"] = foi;} else{ capNode["sh:path"]["@id"] = "iot:isActionOf"; capNode["sh:hasValue"] = foi;} shapeJson['@graph'].push(capNode); } function removeDuplicates(arr){ var unique_array = [] for(var i = 0;i < arr.length; i++){ if(unique_array.indexOf(arr[i]) == -1){ unique_array.push(arr[i]) } } return unique_array } module.exports.addConfigAttributes = addConfigAttributes; module.exports.removeDuplicates = removeDuplicates;