diff --git a/CMakeLists.txt b/CMakeLists.txt index 4324612e0bc3cc61cc98d19ad596bdadf9baf788..fdeb0b4e233dc148b56fb4ae97bc79fbae68779a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -92,7 +92,7 @@ set(CPACK_GENERATOR "RPM") set(CPACK_PACKAGE_NAME "irods-uu-microservices") set(CPACK_PACKAGE_VENDOR "Utrecht University <fbyoda@uu.nl>") set(CPACK_PACKAGE_CONTACT "Utrecht University <fbyoda@uu.nl>") -set(CPACK_PACKAGE_VERSION "4.1.11_0.3.0") +set(CPACK_PACKAGE_VERSION "4.1.11_0.3.3") set(CPACK_PACKAGE_DESCRIPTION_FILE "${CMAKE_CURRENT_SOURCE_DIR}/package/description.txt") set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "Miscellaneous microservices developed by Utrecht university.") diff --git a/src/msiLoadMetadataFromXml.cc b/src/msiLoadMetadataFromXml.cc index eabee0f685dd26fa4a5387da3cf797ba6a936800..34b7424625536d8e6e5aebd00ce27cfca35012ce 100644 --- a/src/msiLoadMetadataFromXml.cc +++ b/src/msiLoadMetadataFromXml.cc @@ -114,12 +114,13 @@ msiLoadMetadataFromXml(msParam_t *targetObj, msParam_t *xmlParam, ruleExecInfo_t /* for new AVU creation */ modAVUMetadataInp_t modAVUMetadataInp; - const int MAX_ATTR_NAME_LEN = 2700; - const int MAX_ATTR_VALUE_LEN = 2700; - const int MAX_ATTR_UNIT_LEN = 250; + const size_t MAX_ATTR_NAME_LEN = 2700; + const size_t MAX_ATTR_VALUE_LEN = 2700; + const size_t MAX_ATTR_UNIT_LEN = 250; char* attrName; char* attrValue; char* attrUnit; + size_t attrNameLen, attrValueLen, attrUnitLen; rodsLong_t coll_id; @@ -152,16 +153,7 @@ msiLoadMetadataFromXml(msParam_t *targetObj, msParam_t *xmlParam, ruleExecInfo_t } - /* Get path of XML document */ - /* - rei->status = parseMspForDataObjInp (xmlObj, &xmlDataObjInp, &myXmlDataObjInp, 0); - if (rei->status < 0) - { - rodsLog (LOG_ERROR, "msiLoadMetadataFromXml: input xmlObj error. status = %d", rei->status); - return (rei->status); - } - */ if ( strcmp( xmlParam->type, BUF_LEN_MS_T) == 0 && xmlParam->inpOutBuf != NULL) { @@ -171,6 +163,14 @@ msiLoadMetadataFromXml(msParam_t *targetObj, msParam_t *xmlParam, ruleExecInfo_t } else if ( strcmp( xmlParam->type, STR_MS_T) == 0 || strcmp( xmlParam->type, DataObjInp_MS_T) == 0) { + /* Get path of XML document */ + rei->status = parseMspForDataObjInp (xmlParam, &xmlDataObjInp, &myXmlDataObjInp, 0); + if (rei->status < 0) + { + rodsLog (LOG_ERROR, "msiLoadMetadataFromXml: input xmlObj error. status = %d", rei->status); + return (rei->status); + } + /******************************** OPEN AND READ FROM XML OBJECT ********************************/ /* Open XML file */ @@ -264,32 +264,43 @@ msiLoadMetadataFromXml(msParam_t *targetObj, msParam_t *xmlParam, ruleExecInfo_t attrName = (char*)xmlNodeGetContent(getChildNodeByName(nodes->nodeTab[i], "Attribute")); if (!attrName) { rodsLog (LOG_ERROR, "msiLoadMetadataFromXml: AVU does not contain an Attribute element"); - break; + continue; } - if (strlen(attrName) > MAX_ATTR_NAME_LEN) { - rodsLog (LOG_ERROR, "msiLoadMetadataFromXml: attribute name is too large (>%d) - %s", - MAX_ATTR_NAME_LEN, attrName); - break; + attrNameLen = strlen(attrName); + if (attrNameLen > MAX_ATTR_NAME_LEN) { + rodsLog (LOG_ERROR, "msiLoadMetadataFromXml: attribute name for AVU #%d is too large (%d>%d)", + i + 1, attrNameLen, MAX_ATTR_NAME_LEN, attrName); + continue; + } else if (attrNameLen == 0) { + rodsLog (LOG_ERROR, "msiLoadMetadataFromXml: attribute name for AVU #%d is empty", + i + 1); } attrValue = (char*)xmlNodeGetContent(getChildNodeByName(nodes->nodeTab[i], "Value")); if (!attrValue) { - rodsLog(LOG_ERROR, "msiLoadMetadataFromXml: AVU does not contain an Value element"); - break; + rodsLog(LOG_ERROR, "msiLoadMetadataFromXml: AVU #%d does not contain a Value element", + i + 1); + continue; } - if (strlen(attrValue) > MAX_ATTR_VALUE_LEN) { - rodsLog (LOG_ERROR, "msiLoadMetadataFromXml: attribute value is too large (>%d) - %s", - MAX_ATTR_VALUE_LEN, attrValue); - break; + attrValueLen = strlen(attrValue); + if (attrValueLen > MAX_ATTR_VALUE_LEN) { + rodsLog (LOG_ERROR, "msiLoadMetadataFromXml: attribute value is too large (%d>%d) - %s", + attrValueLen, MAX_ATTR_VALUE_LEN, attrValue); + continue; + } else if (attrValueLen == 0) { + rodsLog(LOG_ERROR, "msiLoadMetadataFromXml: attribute value in AVU #%d with name '%s' is empty", + i + 1, attrName); + continue; } attrUnit = (char*)xmlNodeGetContent(getChildNodeByName(nodes->nodeTab[i], "Unit")); /* attrUnit can be null */ if (attrUnit) { - if (strlen(attrUnit) > MAX_ATTR_UNIT_LEN) { - rodsLog (LOG_ERROR, "msiLoadMetadataFromXml: attribute unit is too large (>%d) - %s", - MAX_ATTR_UNIT_LEN, attrUnit); - break; + attrUnitLen = strlen(attrUnit); + if (attrUnitLen > MAX_ATTR_UNIT_LEN) { + rodsLog (LOG_ERROR, "msiLoadMetadataFromXml: attribute unit in AVU #%d is too large (%d>%d)", + i + 1, attrUnitLen, MAX_ATTR_UNIT_LEN, attrUnit); + continue; } } diff --git a/tests/avu.xml b/tests/avu.xml new file mode 100644 index 0000000000000000000000000000000000000000..8424820c47b0d8ba04ca92363eca8f0a9c319bfd --- /dev/null +++ b/tests/avu.xml @@ -0,0 +1,49 @@ +<?xml version="1.0" encoding="UTF-8"?> +<metadata> +<!-- This is ment to test msiLoadMetadataFromXml --> + <AVU></AVU> + <AVU> + <Attribute>Test entities</Attribute> + <Value>'Komkommer & Tomaat > Rucola"</Value> + <Unit>kg</Unit> + </AVU> + <AVU> + <Attribute></Attribute> + <Value>Empty Attribute</Value> + </AVU> + <AVU> + <Attribute>Test Empty Value</Attribute> + <Value></Value> + </AVU> + <AVU> + <Attribute>Test No Value</Attribute> + <Unit>N/A</Unit> + </AVU> + <AVU> + <Attribute>Test Chinese</Attribute> + <Value>>価点行思先景録再選町能法日</Value> + <Unit>Chinese</Unit> + </AVU> + <AVU> + <Attribute>Test Chinese Too long</Attribute> + <Value>価点行思先景録再選町能法日。無体予表食棄教山知単北議献堀康二。協稿定用需田教露恒政氷明庭当効。向速兆類日落木逃中学消展審以産今。多信県喫党情茨著説文経憂仲。応著理給着級覧帯脇転術戸。索理価掲読中載中当労残社骨戦。界雨権金断辞故引並竹剤長。報薬上紀京音月年手易和断更戦同体羽先。長井政栂掲端金質未誕意住更衣経外庫用。 + +金参家針掲層費越辛親謙可。索屋治防陽上茂富全確消分題回速能問。町断情堀宮了海事写祉一土杯況。初羽報評降町困串最現問相権介型国。首斎光同了者幕為祭塚人年講題博。時駐待風偽雲郵書並企間人落授介見経。調均佐高席申稼放中球市方来作権足園専占。同著京禁事署組分館表佐編円載棋企朝。場分探教打川木川浅農構記齢催属谷評。 + +軽限融後年断式芸歴沿渋並拉一録百将惑。製検試小精旅優勝度中況込利。下野後影済生起景情富不致正聞図毎構長政。滞争趣組載決逮人野紹及名信経洋法南明。帯甲前他陳天活第少室整資険情夜鋭超既。詐元稿筑学合近思地休工絵話月時。紛情帯断読辞社属九格内非広薬会。愛鎮回禁空相独京雪易軽暮剤経。請難最権催道億権芸組図滞真開文芸待変刊理。 + +上歯録購円供署賦際嗅探提留張男駅。避句親辺系海池記議調護土食売梨真負津市得。競強吾選隊供際激崩読覧迎組運済爆歩。合格情楽学歩販申同倉訴威並投介。再脱年問投全投姫低源入真香聞芸。東伝盗心多左始志測能籍禁荏相阪。子起請伝電都見始例回空続覚資基妨政軽割。属不氷広子稿消金手張意繰社善外取護能明扱。台谷野締細文日漁対独皇必権。 + +領特記重取以南根日長最本図情権十。写近力人停車関飛係文掲南。必角認実載高使打端読罪水判家衝事。速桂著海場筋評府市止精考年。性材圧開料化運刊提択円一対浮作魚者初。気想暮連上仕収町豊人込光棋。放必自接離式早風遺現同効多明軍刊。経聞情航文場投単職必共応朝社。目迎麦流入更問能内露麻際安前。落吉報準午潟委症歴支小要代金着界高。 + +超教目放供安詳棋勝付以知府誇動図夏事江馴。切島外援食始前掲動院意武。炎金氏葉読産例無各能脂開進旅止大稿国面。当扱問占球緊着木出寄座隆非必。日周更板立広圧人兼真数掲界魚引。手真弘外真演来路金一泉委相。国住千南調梁真同体規委場増念係供報。復込写前松際崎心載後過得隊択。必展毎齢有届豊面手掲権連。字読量降育治再訴福下拉生約止。 + +育弁温売上表罪際何外輸画死個不悲場決。社願原制神祝択警挙飲玲掲的武。用松連手日暮政試技覧目王会増惑図務進崎逃。終族昭文体扶森近三別狩税帯高住調芸庁点場。書起社転若方館医収事紙学雇。視主酒元調味画持題開月貝。神運設相舎歩勇一歌自約新要聞加略毎苦問行。橋並月三毎業観達南作教教当。要項済作続野週字民住村戦議対年区必軍供方。 + +近専評新市備市選下哲中表。活掲祭記事企系書腕民隆前身後掲公週人戦。生告売最本九世指価位月書告稿今供。念九午記町聞対発廷社労古台州早質臼社。置川夜菓阪凍下並要村子大郎産。米以障惑響州僕告検無目夕。券不一転男設作駐決覧生函摩団元電万意月住。最者北番百習治問市熱台井見更佑始一女難日。整層選昌庭公痛差技軒七山読程線宿念商索。 + +多殊行著必量安供直紹見行格。堀戸球題話巣力制分念使降辺育歌詳券里蘭月。状国良発阪提縁挙景問祝者田取著。会育大用上載楽台発探入程団平。限離経夜橋初史大産申点裁作断具。酸覧設製備型一備原参改会績初覧平下。下定中難結景外掲誇景夜真。校南会入考月定職部投首入好。年形加技前禁魅術坪前国書夫。謙問速機払権無学阪掲冷要年批美治経政。 +</Value> +<Unit>Chinese</Unit> +</AVU> +</metadata> diff --git a/tests/msi_json_arrayops_test.r b/tests/msi_json_arrayops_test.r index 5e41b1a188215f0301bd2a123bdfe72f7dcecbf9..5e6022a35704322b9b7f394badf30b52920f6a7f 100644 --- a/tests/msi_json_arrayops_test.r +++ b/tests/msi_json_arrayops_test.r @@ -6,7 +6,7 @@ myTestRule { *item2 = 'U123456-ru.nl'; *item3 = '{"type":"PMID","id":"12345"}'; *item4 = '{"type":"arXiv","id":"xyz/abc"}'; - *item5 = 'null'; + *item5 = '1'; *item6 = 'true'; *item7 = 'false'; *item8 = '["DICOM","test"]'; @@ -22,23 +22,23 @@ myTestRule { *ec = errorcode( msi_json_arrayops(*json_str, *item8, "add", *size) ); # adding null does not supported? - #*ec = errorcode( msi_json_arrayops(*json_str, *item5, "add", *size) ); + *ec = errorcode( msi_json_arrayops(*json_str, *item5, "add", *size) ); # adding those will append additional boolean values to array - #*ec = errorcode( msi_json_arrayops(*json_str, *item6, "add", *size) ); - #*ec = errorcode( msi_json_arrayops(*json_str, *item7, "add", *size) ); + *ec = errorcode( msi_json_arrayops(*json_str, *item6, "add", *size) ); + *ec = errorcode( msi_json_arrayops(*json_str, *item7, "add", *size) ); # adding those will not change array because they have been presented in it - #*ec = errorcode( msi_json_arrayops(*json_str, *item1, "add", *size) ); - #*ec = errorcode( msi_json_arrayops(*json_str, *item2, "add", *size) ); - #*ec = errorcode( msi_json_arrayops(*json_str, *item3, "add", *size) ); - #*ec = errorcode( msi_json_arrayops(*json_str, *item4, "add", *size) ); + *ec = errorcode( msi_json_arrayops(*json_str, *item1, "add", *size) ); + *ec = errorcode( msi_json_arrayops(*json_str, *item2, "add", *size) ); + *ec = errorcode( msi_json_arrayops(*json_str, *item3, "add", *size) ); + *ec = errorcode( msi_json_arrayops(*json_str, *item4, "add", *size) ); writeLine("stdout", *json_str ++ " size: " ++ *size); ## remove JSON object (rm/find) - #*ec = errorcode( msi_json_arrayops(*json_str, *item3, "rm", *size) ); - #writeLine("stdout", *json_str ++ " size: " ++ *size); + *ec = errorcode( msi_json_arrayops(*json_str, *item3, "rm", *size) ); + writeLine("stdout", *json_str ++ " size: " ++ *size); #*idx = 0; #*ec = errorcode( msi_json_arrayops(*json_str, *item5, "find", *idx) ); @@ -57,7 +57,7 @@ myTestRule { *ec = errorcode( msi_json_arrayops(*json_str, "", "size", *mysize) ); writeLine("stdout", *json_str ++ " size: " ++ str(*mysize)); - *idx = 0; + *idx = 1; *item1 = ""; *ec = errorcode( msi_json_arrayops(*json_str, *item1, "get", *idx) ); writeLine("stdout", *json_str ++ " " ++ *item1 ++ " at idx: " ++ str(*idx)); diff --git a/tests/test_msiLoadMetadataFromXml_Buf.r b/tests/test_msiLoadMetadataFromXml_Buf.r new file mode 100644 index 0000000000000000000000000000000000000000..37fbca1397405f9d68d746761509b36d2c0cf7a1 --- /dev/null +++ b/tests/test_msiLoadMetadataFromXml_Buf.r @@ -0,0 +1,30 @@ +testRule { + if (*objPath=="") { + writeLine("stdout", "\*objPath is a required parameter"); + fail; + } + + msiGetIcatTime(*timestamp, 'unix'); + *str = +"<?xml version=\"1.0\" encoding=\"UTF-8\"?> +<metadata> + <AVU> + <Attribute>TestAttribute1</Attribute> + <Value>TestValue *timestamp</Value> + </AVU> + <AVU> + <Attribute></Attribute> + <Value></Value> + </AVU> + <AVU> + <Attribute>TestAttribute2</Attribute> + <Value>TestValue *timestamp</Value> + <Unit>km/h</Unit> + </AVU> +</metadata>" + + msiStrToBytesBuf(*str, *buf); + msiLoadMetadataFromXml(*objPath, *buf); +} +input *objPath="" +output ruleExecOut diff --git a/tests/test_msiLoadMetadataFromXml_File.r b/tests/test_msiLoadMetadataFromXml_File.r new file mode 100644 index 0000000000000000000000000000000000000000..54aed64645fc290cd2aea9f59a9a1e1d992e3c70 --- /dev/null +++ b/tests/test_msiLoadMetadataFromXml_File.r @@ -0,0 +1,10 @@ +testRule { + if (*objPath=="" || *avuXml =="") { + writeLine("stdout", "\*objPath and \*avuXml are a required parameters"); + fail; + } + + msiLoadMetadataFromXml(*objPath, *avuXml); +} +input *objPath="", *avuXml="" +output ruleExecOut diff --git a/tests/test_msiXsltApply.r b/tests/test_msiXsltApply.r new file mode 100644 index 0000000000000000000000000000000000000000..02a825feadc429f4bd04cb218b55523875ab92d9 --- /dev/null +++ b/tests/test_msiXsltApply.r @@ -0,0 +1,10 @@ +testRule { + if (*xsltObj=="" || *xmlObj=="") { + writeLine("stdout", "\*xsltObj and \*xmlObj are required parameters"); + } else { + msiXsltApply(*xsltObj, *xmlObj, *outputBuf); + writeBytesBuf("stdout", *outputBuf); + } +} +input *xsltObj="", *xmlObj="" +output ruleExecOut