3 declare(strict_types=1);
49 require_once(
"SeqActivity.php");
51 require_once(
"SeqRule.php");
52 require_once(
"SeqRuleset.php");
54 require_once(
"SeqCondition.php");
55 require_once(
"SeqConditionSet.php");
57 require_once(
"SeqObjective.php");
58 require_once(
"SeqObjectiveMap.php");
60 require_once(
"SeqRollupRule.php");
61 require_once(
"SeqRollupRuleset.php");
63 require_once(
"ADLAuxiliaryResource.php");
69 $doc =
new DomDocument();
71 $organizations = $doc->getElementsByTagName(
"organizations");
74 $item = $organizations->item(0);
76 $default = preg_replace(
'/(%20)+/',
' ', trim($item->getAttribute(
"default")));
80 $organization = $doc->getElementsByTagName(
"organization");
83 foreach ($organization as $element) {
84 if (preg_replace(
'/(%20)+/',
' ', trim($element->getAttribute(
"identifier"))) == $default) {
85 $default_organization = $element;
90 $seqCollection = $doc->getElementsByTagName(
"sequencingCollection")->item(0);
92 $root = $this->
buildNode($default_organization, $seqCollection, $doc);
95 $objectivesGlobalToSystem = $default_organization->getAttributeNS(
"http://www.adlnet.org/xsd/adlseq_v1p3",
"objectivesGlobalToSystem");
97 $org = preg_replace(
'/(%20)+/',
' ', trim($default_organization->getAttribute(
"identifier")));
102 if ($objectivesGlobalToSystem ===
"false") {
107 $dataGlobalToSystem = $default_organization->getAttributeNS(
"http://www.adlnet.org/xsd/adlcp_v1p3",
"sharedDataGlobalToSystem");
110 $dataglobaltosystem = 1;
112 if ($dataGlobalToSystem ===
"false") {
113 $dataglobaltosystem = 0;
117 $c_root[
'_SeqActivity'] = $root;
119 $ret[
'global'] = $globaltosystem;
120 $ret[
'dataglobal'] = $dataglobaltosystem;
121 $ret[
'tree'] = $c_root;
134 $act->setID(preg_replace(
'/(%20)+/',
' ', trim($node->getAttribute(
"identifier"))));
136 $tempVal = preg_replace(
'/(%20)+/',
' ', trim($node->getAttribute(
"identifierref")));
138 $act->setResourceID($tempVal);
141 $tempVal = $node->getAttribute(
"isvisible");
144 $act->setIsVisible(self::convert_to_bool($tempVal));
150 $children = $node->childNodes;
152 for ($i = 0; $i < $children->length; $i++) {
153 $curNode = $children->item($i);
156 if ($curNode->nodeType == XML_ELEMENT_NODE) {
158 if ($curNode->localName ===
"item") {
161 $nestedAct = $this->
buildNode($curNode, $seq, $doc);
162 if ($nestedAct != null) {
163 $act->AddChild((
object) $nestedAct);
165 } elseif ($curNode->localName ===
"title") {
166 $act->setTitle(self::lookupElement($curNode, null));
167 } elseif ($curNode->localName ===
"completionThreshold") {
168 $tempVal = $curNode->getAttribute(
"minProgressMeasure");
171 $act->setCompletionThreshold($tempVal);
172 } elseif ($curNode->nodeValue != null && $curNode->nodeValue !=
'') {
173 $act->setCompletionThreshold((
float) $curNode->nodeValue);
176 $tempVal = $curNode->getAttribute(
"progressWeight");
179 $act->setProgressWeight($tempVal);
181 $tempVal = $curNode->getAttribute(
"completedByMeasure");
184 $act->setCompletedByMeasure(self::convert_to_bool($tempVal));
186 } elseif ($curNode->localName ===
"sequencing") {
189 $tempVal = preg_replace(
'/(%20)+/',
' ', trim($curNode->getAttribute(
"IDRef")));
196 $sequencing = $seq->getElementsByTagName(
"sequencing");
199 foreach ($sequencing as $element) {
200 if (preg_replace(
'/(%20)+/',
' ', trim($element->getAttribute(
"ID"))) == $tempVal) {
201 $seqGlobal = $element;
206 $seqInfo = $seqGlobal->cloneNode(
true);
209 $seqChildren = $curNode->childNodes;
210 for ($j = 0; $j < $seqChildren->length; $j++) {
212 $curChild = $seqChildren->item($j);
213 if ($curChild->nodeType == XML_ELEMENT_NODE) {
216 $seqInfo->appendChild($curChild);
228 $item = $children->item($i)->nodeValue;
239 $children = $iNode->childNodes;
240 for ($i = 0; $i < $children->length; $i++) {
241 $curNode = $children->item($i);
242 if ($curNode->nodeType == XML_ELEMENT_NODE) {
243 if ($curNode->localName ===
"controlMode") {
245 $tempVal = $curNode->getAttribute(
"choice");
247 $ioAct->setControlModeChoice(self::convert_to_bool($tempVal));
250 $tempVal = $curNode->getAttribute(
"choiceExit");
252 $ioAct->setControlModeChoiceExit(self::convert_to_bool($tempVal));
256 $tempVal = $curNode->getAttribute(
"flow");
258 $ioAct->setControlModeFlow(self::convert_to_bool($tempVal));
262 $tempVal = $curNode->getAttribute(
"forwardOnly");
264 $ioAct->setControlForwardOnly(self::convert_to_bool($tempVal));
268 $tempVal = $curNode->getAttribute(
"useCurrentAttemptObjectiveInfo");
270 $ioAct->setUseCurObjective(self::convert_to_bool($tempVal));
274 $tempVal = $curNode->getAttribute(
"useCurrentAttemptProgressInfo");
276 $ioAct->setUseCurProgress(self::convert_to_bool($tempVal));
278 } elseif ($curNode->localName ===
"sequencingRules") {
279 $ioAct = self::getSequencingRules($curNode, $ioAct);
280 } elseif ($curNode->localName ===
"limitConditions") {
282 $tempVal = $curNode->getAttribute(
"attemptLimit");
284 $ioAct->setAttemptLimit($tempVal);
288 $tempVal = $curNode->getAttribute(
"attemptAbsoluteDurationLimit");
290 $ioAct->setAttemptAbDur($tempVal);
294 $tempVal = $curNode->getAttribute(
"attemptExperiencedDurationLimit");
296 $ioAct->setAttemptExDur($tempVal);
300 $tempVal = $curNode->getAttribute(
"activityAbsoluteDurationLimit");
302 $ioAct->setActivityAbDur($tempVal);
306 $tempVal = $curNode->getAttribute(
"activityExperiencedDurationLimit");
308 $ioAct->setActivityExDur($tempVal);
312 $tempVal = $curNode->getAttribute(
"beginTimeLimit");
314 $ioAct->setBeginTimeLimit($tempVal);
318 $tempVal = $curNode->getAttribute(
"endTimeLimit");
320 $ioAct->setEndTimeLimit($tempVal);
322 } elseif ($curNode->localName ===
"auxiliaryResources") {
323 $ioAct = self::getAuxResources($curNode, $ioAct);
324 } elseif ($curNode->localName ===
"rollupRules") {
325 $ioAct = self::getRollupRules($curNode, $ioAct);
326 } elseif ($curNode->localName ===
"objectives" && $curNode->namespaceURI ===
"http://www.imsglobal.org/xsd/imsss") {
327 $ioAct = self::getObjectives($curNode, $ioAct);
328 } elseif ($curNode->localName ===
"objectives" && $curNode->namespaceURI ===
"http://www.adlnet.org/xsd/adlseq_v1p3") {
329 $ioAct = self::getADLSEQObjectives($curNode, $ioAct);
330 } elseif ($curNode->localName ===
"randomizationControls") {
332 $tempVal = $curNode->getAttribute(
"randomizationTiming");
334 $ioAct->setRandomTiming($tempVal);
338 $tempVal = $curNode->getAttribute(
"selectCount");
340 $ioAct->setSelectCount($tempVal);
344 $tempVal = $curNode->getAttribute(
"reorderChildren");
346 $ioAct->setReorderChildren(self::convert_to_bool($tempVal));
350 $tempVal = $curNode->getAttribute(
"selectionTiming");
352 $ioAct->setSelectionTiming($tempVal);
354 } elseif ($curNode->localName ===
"deliveryControls") {
356 $tempVal = $curNode->getAttribute(
"tracked");
358 $ioAct->setIsTracked(self::convert_to_bool($tempVal));
362 $tempVal = $curNode->getAttribute(
"completionSetByContent");
364 $ioAct->setSetCompletion(self::convert_to_bool($tempVal));
368 $tempVal = $curNode->getAttribute(
"objectiveSetByContent");
370 $ioAct->setSetObjective(self::convert_to_bool($tempVal));
372 } elseif ($curNode->localName ===
"constrainedChoiceConsiderations") {
374 $tempVal = $curNode->getAttribute(
"preventActivation");
376 $ioAct->setPreventActivation(self::convert_to_bool($tempVal));
380 $tempVal = $curNode->getAttribute(
"constrainChoice");
382 $ioAct->setConstrainChoice(self::convert_to_bool($tempVal));
384 } elseif ($curNode->localName ===
"rollupConsiderations") {
386 $tempVal = $curNode->getAttribute(
"requiredForSatisfied");
388 $ioAct->setRequiredForSatisfied($tempVal);
392 $tempVal = $curNode->getAttribute(
"requiredForNotSatisfied");
394 $ioAct->setRequiredForNotSatisfied($tempVal);
398 $tempVal = $curNode->getAttribute(
"requiredForCompleted");
400 $ioAct->setRequiredForCompleted($tempVal);
404 $tempVal = $curNode->getAttribute(
"requiredForIncomplete");
406 $ioAct->setRequiredForIncomplete($tempVal);
410 $tempVal = $curNode->getAttribute(
"measureSatisfactionIfActive");
412 $ioAct->setSatisfactionIfActive(self::convert_to_bool($tempVal));
431 $children = $iNode->childNodes;
432 for ($i = 0; $i < $children->length; $i++) {
433 $curNode = $children->item($i);
434 if ($curNode->nodeType == XML_ELEMENT_NODE) {
435 if ($curNode->localName ===
"primaryObjective" || $curNode->localName ===
"objective") {
437 if ($curNode->localName ===
"primaryObjective") {
438 $obj->mContributesToRollup =
true;
442 $tempVal = preg_replace(
'/(%20)+/',
' ', trim($curNode->getAttribute(
"objectiveID")));
444 $obj->mObjID = $tempVal;
448 $tempVal = $curNode->getAttribute(
"satisfiedByMeasure");
450 $obj->mSatisfiedByMeasure = self::convert_to_bool($tempVal);
453 $tempVal = self::lookupElement($curNode,
"minNormalizedMeasure");
455 $obj->mMinMeasure = (float) $tempVal;
459 $maps = self::getObjectiveMaps($curNode);
465 $c_obj[
'_SeqObjective'] = $obj;
479 $children = $iNode->childNodes;
480 for ($i = 0; $i < $children->length; $i++) {
481 $curNode = $children->item($i);
482 if ($curNode->nodeType == XML_ELEMENT_NODE) {
483 if ($curNode->localName ===
"objective") {
485 $adlseqobjid = preg_replace(
'/(%20)+/',
' ', trim($curNode->getAttribute(
"objectiveID")));
490 $seqobj = $value[
'_SeqObjective'];
491 if ($seqobj->mObjID == $adlseqobjid) {
492 $curseqobj = $seqobj;
493 $curseqobjindex = $j;
499 if ($curseqobj != null) {
501 $curseqobj = self::getADLSeqMaps($curNode, $curseqobj);
502 $seqobj = $curseqobj;
503 $objectives[$curseqobjindex][
'_SeqObjective'] = $seqobj;
516 if (count($curseqobj->mMaps) == null) {
517 $curseqobj->mMaps = array();
519 $maps = $curseqobj->mMaps;
521 $children = $iNode->childNodes;
522 for ($i = 0; $i < $children->length; $i++) {
523 $curNode = $children->item($i);
524 if ($curNode->nodeType == XML_ELEMENT_NODE) {
525 if ($curNode->localName ===
"mapInfo") {
527 $curadltargetobjid = preg_replace(
'/(%20)+/',
' ', trim($curNode->getAttribute(
"targetObjectiveID")));
529 $matchingmapindex = -1;
530 foreach ($maps as $j => $value) {
531 if ($value[
'_SeqObjectiveMap']->mGlobalObjID == $curadltargetobjid) {
532 $map = $value[
'_SeqObjectiveMap'];
533 $matchingmapindex = $j;
537 $map = self::fillinADLSeqMaps($curNode, $map);
539 $c_map[
'_SeqObjectiveMap'] = $map;
540 if ($matchingmapindex > -1) {
541 $maps[$matchingmapindex] = $c_map;
548 $curseqobj->mMaps = $maps;
554 if ($map->mGlobalObjID == null) {
555 $map->mGlobalObjID = preg_replace(
'/(%20)+/',
' ', trim($iNode->getAttribute(
"targetObjectiveID")));
558 $tempVal = $iNode->getAttribute(
"readRawScore");
560 $map->mReadRawScore = self::convert_to_bool($tempVal);
563 $tempVal = $iNode->getAttribute(
"readMinScore");
565 $map->mReadMinScore = self::convert_to_bool($tempVal);
568 $tempVal = $iNode->getAttribute(
"readMaxScore");
570 $map->mReadMaxScore = self::convert_to_bool($tempVal);
573 $tempVal = $iNode->getAttribute(
"readCompletionStatus");
575 $map->mReadCompletionStatus = self::convert_to_bool($tempVal);
578 $tempVal = $iNode->getAttribute(
"readProgressMeasure");
580 $map->mReadProgressMeasure = self::convert_to_bool($tempVal);
583 $tempVal = $iNode->getAttribute(
"writeRawScore");
585 $map->mWriteRawScore = self::convert_to_bool($tempVal);
588 $tempVal = $iNode->getAttribute(
"writeMinScore");
590 $map->mWriteMinScore = self::convert_to_bool($tempVal);
593 $tempVal = $iNode->getAttribute(
"writeMaxScore");
595 $map->mWriteMaxScore = self::convert_to_bool($tempVal);
598 $tempVal = $iNode->getAttribute(
"writeCompletionStatus");
600 $map->mWriteCompletionStatus = self::convert_to_bool($tempVal);
603 $tempVal = $iNode->getAttribute(
"writeProgressMeasure");
605 $map->mWriteProgressMeasure = self::convert_to_bool($tempVal);
615 $children = $iNode->childNodes;
616 for ($i = 0; $i < $children->length; $i++) {
617 $curNode = $children->item($i);
618 if ($curNode->nodeType == XML_ELEMENT_NODE) {
619 if ($curNode->localName ===
"mapInfo") {
623 $tempVal = preg_replace(
'/(%20)+/',
' ', trim($curNode->getAttribute(
"targetObjectiveID")));
625 $map->mGlobalObjID = $tempVal;
629 $tempVal = $curNode->getAttribute(
"readSatisfiedStatus");
631 $map->mReadStatus = self::convert_to_bool($tempVal);
635 $tempVal = $curNode->getAttribute(
"readNormalizedMeasure");
637 $map->mReadMeasure = self::convert_to_bool($tempVal);
641 $tempVal = $curNode->getAttribute(
"writeSatisfiedStatus");
643 $map->mWriteStatus = self::convert_to_bool($tempVal);
647 $tempVal = $curNode->getAttribute(
"writeNormalizedMeasure");
649 $map->mWriteMeasure = self::convert_to_bool($tempVal);
652 $c_map[
'_SeqObjectiveMap'] = $map;
657 if (count($maps) == null) {
667 $rollupRules = array();
670 $tempVal = $iNode->getAttribute(
"rollupObjectiveSatisfied");
672 $ioAct->setIsObjRolledUp(self::convert_to_bool($tempVal));
676 $tempVal = $iNode->getAttribute(
"objectiveMeasureWeight");
678 $ioAct->setObjMeasureWeight((
float)$tempVal);
681 $tempVal = $iNode->getAttribute(
"rollupProgressCompletion");
683 $ioAct->setIsProgressRolledUp(self::convert_to_bool($tempVal));
685 $children = $iNode->childNodes;
686 for ($i = 0; $i < $children->length; $i++) {
687 $curNode = $children->item($i);
688 if ($curNode->nodeType == XML_ELEMENT_NODE) {
689 if ($curNode->localName ===
"rollupRule") {
693 $tempVal = $curNode->getAttribute(
"childActivitySet");
695 $rule->mChildActivitySet = $tempVal;
698 $tempVal = $curNode->getAttribute(
"minimumCount");
700 $rule->mMinCount = $tempVal;
704 $tempVal = $curNode->getAttribute(
"minimumPercent");
706 $rule->mMinPercent = $tempVal;
709 $conditions = array();
710 $ruleInfo = $curNode->childNodes;
711 for ($j = 0; $j < $ruleInfo->length; $j++) {
712 $curRule = $ruleInfo->item($j);
714 if ($curRule->nodeType == XML_ELEMENT_NODE) {
715 if ($curRule->localName ===
"rollupConditions") {
716 $tempVal = $curRule->getAttribute(
"conditionCombination");
718 $rule->mConditions[
'_SeqConditionSet']->mCombination = $tempVal;
720 $rule->mConditions[
'_SeqConditionSet']->mCombination =
COMBINATION_ANY;
722 $conds = $curRule->childNodes;
723 for ($k = 0; $k < $conds->length; $k++) {
724 $con = $conds->item($k);
725 if ($con->nodeType == XML_ELEMENT_NODE) {
726 if ($con->localName ===
"rollupCondition") {
729 $tempVal = $con->getAttribute(
"condition");
731 $cond->mCondition = $tempVal;
734 $tempVal = $con->getAttribute(
"operator");
736 if ($tempVal ===
'not') {
743 $c_cond[
'_SeqCondition'] = $cond;
744 $conditions[] = $c_cond;
748 } elseif ($curRule->localName ===
"rollupAction") {
749 $tempVal = $curRule->getAttribute(
"action");
751 $rule->setRollupAction($tempVal);
757 $rule->mConditions[
'_SeqConditionSet']->mConditions = $conditions;
761 $c_rule[
'_SeqRollupRule'] = $rule;
762 $rollupRules[] = $c_rule;
767 if ($rollupRules != null) {
771 $c_rules[
'_SeqRollupRuleset'] = $rules;
772 $ioAct->setRollupRules($c_rules);
786 $exitRules = array();
787 $postRules = array();
790 $children = $iNode->childNodes;
793 for ($i = 0; $i < $children->length; $i++) {
794 $curNode = $children->item($i);
795 if ($curNode->nodeType == XML_ELEMENT_NODE) {
796 if ($curNode->localName ===
"preConditionRule" || $curNode->localName ===
"exitConditionRule" || $curNode->localName ===
"postConditionRule") {
798 $ruleInfo = $curNode->childNodes;
799 for ($j = 0; $j < $ruleInfo->length; $j++) {
800 $curRule = $ruleInfo->item($j);
802 if ($curRule->nodeType == XML_ELEMENT_NODE) {
803 if ($curRule->localName ===
"ruleConditions") {
804 $rule->mConditions = self::extractSeqRuleConditions($curRule);
805 } elseif ($curRule->localName ===
"ruleAction") {
806 $tempVal = $curRule->getAttribute(
"action");
808 $rule->mAction = $tempVal;
813 if ($rule->mConditions != null && $rule->mAction != null) {
815 if ($curNode->localName ===
"preConditionRule") {
818 $c_rule[
'_SeqRule'] = $rule;
819 $preRules[] = $c_rule;
821 if ($curNode->localName ===
"exitConditionRule") {
824 $c_rule[
'_SeqRule'] = $rule;
825 $exitRules[] = $c_rule;
827 if ($curNode->localName ===
"postConditionRule") {
830 $c_rule[
'_SeqRule'] = $rule;
831 $postRules[] = $c_rule;
838 if (count($preRules) > 0) {
841 $c_rules[
'_SeqRuleset'] = $rules;
842 $ioAct->setPreSeqRules($c_rules);
845 if (count($exitRules) > 0) {
848 $c_rules[
'_SeqRuleset'] = $rules;
849 $ioAct->setExitSeqRules($c_rules);
851 if (count($postRules) > 0) {
854 $c_rules[
'_SeqRuleset'] = $rules;
855 $ioAct->setPostSeqRules($c_rules);
867 $conditions = array();
868 $tempVal = $iNode->getAttribute(
"conditionCombination");
870 $condSet->mCombination = $tempVal;
874 $condInfo = $iNode->childNodes;
875 for ($i = 0; $i < $condInfo->length; $i++) {
876 $curCond = $condInfo->item($i);
877 if ($curCond->nodeType == XML_ELEMENT_NODE) {
878 if ($curCond->localName ===
"ruleCondition") {
882 $tempVal = $curCond->getAttribute(
"condition");
884 $cond->mCondition = $tempVal;
888 $tempVal = preg_replace(
'/(%20)+/',
' ', trim($curCond->getAttribute(
"referencedObjective")));
890 $cond->mObjID = $tempVal;
894 $tempVal = $curCond->getAttribute(
"measureThreshold");
896 $cond->mThreshold = $tempVal;
900 $tempVal = $curCond->getAttribute(
"operator");
902 if ($tempVal ===
'not') {
910 $c_cond[
'_SeqCondition'] = $cond;
911 $conditions[] = $c_cond;
916 if (count($conditions) > 0) {
917 $condSet->mConditions = $conditions;
919 $condSet->mConditions = null;
922 $c_condSet[
'_SeqConditionSet'] = $condSet;
932 $children = $iNode->childNodes;
935 for ($i = 0; $i < $children->length; $i++) {
936 $curNode = $children->item($i);
937 if ($curNode->nodeType == XML_ELEMENT_NODE) {
938 if ($curNode->localName ===
"auxiliaryResource") {
943 $tempVal = $curNode->getAttribute(
"purpose");
945 $res->mType = $tempVal;
948 $tempVal = preg_replace(
'/(%20)+/',
' ', trim($curNode->getAttribute(
"auxiliaryResourceID")));
950 $res->mResourceID = $tempVal;
957 $c_auxRes[
'_ADLAuxiliaryResource'] = $auxRes;
958 $ioAct->setAuxResources($c_auxRes);
966 return strtoupper($string) !==
"FALSE";
970 private static function lookupElement(
object $iNode, ?
string $iElement): ?string
976 if ($iNode != null && $iElement != null) {
977 $children = $iNode->childNodes;
978 for ($i = 0; $i < $children->length; $i++) {
979 $curNode = $children->item($i);
980 if (($curNode->nodeType == XML_ELEMENT_NODE)) {
981 if ($curNode->localName == $iElement) {
986 if ($curNode != null) {
987 $comp = $curNode->localName;
989 if ($comp != $iElement) {
1001 if ($curNode != null) {
1002 $children = $curNode->childNodes;
1003 if ($children != null) {
1004 for ($i = 0; $i < $children->length; $i++) {
1005 $curNode = $children->item($i);
1007 if (($curNode->nodeType == XML_TEXT_NODE) || ($curNode->nodeType == XML_CDATA_SECTION_NODE)) {
1008 $value = $value . $curNode->nodeValue;
static getLogger(string $a_component_id)
Get component logger.
static convert_to_bool(string $string)
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
static getRollupRules(object $iNode, object $ioAct)
static getAuxResources(object $iNode, object $ioAct)
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
extractSeqInfo(object $iNode, object $ioAct)
static fillinADLSeqMaps(object $iNode, object $map)
static getObjectives(object $iNode, object $ioAct)
static getADLSEQObjectives(object $iNode, object $ioAct)
buildNode(object $node, ?object $seq, object $doc)
static getObjectiveMaps(object $iNode)
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
static extractSeqRuleConditions(object $iNode)
buildNodeSeqTree(string $file)
static lookupElement(object $iNode, ?string $iElement)
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
static getADLSeqMaps(object $iNode, object $curseqobj)
static getSequencingRules(object $iNode, object $ioAct)