Step 39 – Resolving Resource Dependencies

This is the new routine that I’m going to use to resolve the resource dependencies in the package manifest file.

function resolveIMSManifestDependencies($identifier) {

  global $resourceData;

  $files = $resourceData[$identifier]['files'];

  $dependencies = $resourceData[$identifier]['dependencies'];
  if (is_array($dependencies)) {
    foreach ($dependencies as $d => $dependencyidentifier) {
      $files = array_merge($files,resolveIMSManifestDependencies($dependencyidentifier));
      unset($resourceData[$identifier]['dependencies'][$d]); 
    }
    $files = array_unique($files);
  }

  return $files;

}

Here’s what I’m doing – line-by-line:

  • Line 1: The function takes a resource identifier as its argument.
     
  • Line 3: I’m going to process the data that I’ve stored in the $resourceData array, so I make it a global variable. I’ll have to do the same in the readIMSManifestFile() function, but more of that later.
     
  • Line 5: I read the existing list of files for this resource (see line 1) into an array. I’ll be updating this as I go through the function.
     
  • Line 7: I read the dependency information for this resource into an array called $dependencies.
     
  • Lines 8 through 14: I loop through each of the dependencies for this resource.
     
  • Line 10: This is the line that does the hard work. What I do is to merge together my existing ‘files’ array with a new ‘files’ array that I create by recursively calling the resolveIMSManifestDependencies() for each dependency (and any of its dependencies).
     
  • Line 11: Since I’ve resolved this dependency (and any of its dependencies), I unset the dependency data in the $resourceData array so that I don’t process it again.
     
  • Line 13: I eliminate any duplicate entries in the ‘files’ array.
     
  • Line 16: I return the ‘files’ array to the calling program.
     

Now I have to modify the readIMSManifestFile() function so that it looks like this.

function readIMSManifestFile($manifestfile) {

  // PREPARATIONS

  // central array for resource data
  global $resourceData;

  // load the imsmanifest.xml file
  $xmlfile = new DomDocument;
  $xmlfile->preserveWhiteSpace = FALSE;
  $xmlfile->load($manifestfile);

  // adlcp namespace
  $manifest = $xmlfile->getElementsByTagName('manifest');
  $adlcp = $manifest->item(0)->getAttribute('xmlns:adlcp');

  // READ THE RESOURCES LIST

  // array to store the results
  $resourceData = array();

  // get the list of resource element
  $resourceList = $xmlfile->getElementsByTagName('resource');

  $r = 0;
  foreach ($resourceList as $rtemp) {

    // decode the resource attributes
    $identifier = $resourceList->item($r)->getAttribute('identifier');
    $resourceData[$identifier]['type'] = $resourceList->item($r)->getAttribute('type');
    $resourceData[$identifier]['scormtype'] = $resourceList->item($r)->getAttribute('adlcp:scormtype');
    $resourceData[$identifier]['href'] = $resourceList->item($r)->getAttribute('href');

    // list of files
    $fileList = $resourceList->item($r)->getElementsByTagName('file');

    $f = 0;
    foreach ($fileList as $ftemp) {
      $resourceData[$identifier]['files'][$f] =  $fileList->item($f)->getAttribute('href');
      $f++;
    }

    // list of dependencies
    $dependencyList = $resourceList->item($r)->getElementsByTagName('dependency');

    $d = 0;
    foreach ($dependencyList as $dtemp) {
      $resourceData[$identifier]['dependencies'][$d] =  $dependencyList->item($d)->getAttribute('identifierref');
      $d++;
    }

    $r++;

  }

  // resolve resource dependencies to create the file lists for each resource
  foreach ($resourceData as $identifier => $resource) {
    $resourceData[$identifier]['files'] = resolveIMSManifestDependencies($identifier);
  }

  // READ THE ITEMS LIST
 
  // PROCESS THE ITEMS LIST TO FIND SCOS
 
  // RETURN RESULTS

}

The changes are:

  • Line 6: I make the $resourceData array – a working array where I store all of the information as I process it – global so that it’s accessible to the resolveIMSManifestDependencies() function.
     
  • Lines 44 to 49: I create a list of dependencies for each resource, and save it into the $resourceData array.
     
  • Lines 56 to 59: After I’ve read all of the data for the resources (the loop finishes on line 54) I loop through the list of resources again and resolve all of the dependencies by calling resolveIMSManifestDependencies() as I described above.
     

Now that I’ve read all of the resources data, I’m going to read the items data. That will be my next post.

This entry was posted in Content Aggregation Model. Bookmark the permalink.

Leave a Reply

Your email address will not be published. Required fields are marked *