<?php
/*******************************************************************************
 * Copyright (c) 2007 IBM Corporation and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/

/*
 * Parse the given XML file and return an array with Project objects based on its contents.
 */
function parse($file) {
  $result = array();
  $doc = new DOMDocument();
  $doc->load($file);
  $root = $doc->documentElement;

  foreach ($root->childNodes as $child) {
    if ($child->nodeType != XML_ELEMENT_NODE) continue;
    if (strcasecmp($child->nodeName, ELEMENT_PROJECT) != 0) continue;
    $project = createProject($child);
    if ($project != NULL) array_push($result, $project);
  }
  return $result;
}

/*
 * Create and return a Project object based on the given DOM node.
 */
function createProject($node) {
  $project = new project();
  $project->id =$node->getAttribute(ATTRIBUTE_ID);
  $project->version = $node->getAttribute(ATTRIBUTE_VERSION);
  $status = $node->getAttribute(ATTRIBUTE_STATUS);
  if (strcasecmp($status, VALUE_STATUS_DONE) == 0) {
    $project->status = STATUS_DONE;
  }
  foreach ($node->childNodes as $child) {
    if ($child->nodeType != XML_ELEMENT_NODE) continue;
    if (strcasecmp($child->nodeName, ELEMENT_INFO) == 0) {
      $project->info = createInfo($child);
    } else if (strcasecmp($child->nodeName, ELEMENT_CONTACT) == 0) {
      $project->contact = createContact($child);
    } else if (strcasecmp($child->nodeName, ELEMENT_NOTES) == 0) {
      $project->notes = createNotes($child);
    } else if (strcasecmp($child->nodeName, ELEMENT_LEGAL) == 0) {
      $project->legal[] = createLegal($child);
    } else {
      // TODO error
    }
  }
  return $project;
}

/*
 * Create and return an Info object based on the given DOM node.
 */
function createInfo($node) {
  $info = new info();
  foreach ($node->childNodes as $child) {
    if ($child->nodeType != XML_ELEMENT_NODE) continue;
    if (strcasecmp($child->nodeName, ELEMENT_NAME) == 0) {
      $info->name = getText($child);
    } else if (strcasecmp($child->nodeName, ELEMENT_ORIGIN) == 0) {
      $info->origin = getText($child);
    } else if (strcasecmp($child->nodeName, ELEMENT_REFERENCE) == 0) {
      $info->reference = getText($child);
    } else if (strcasecmp($child->nodeName, ELEMENT_REPOSITORY) == 0) {
      $info->repository = getText($child);
    } else if (strcasecmp($child->nodeName, ELEMENT_LOCATION) == 0) {
      $info->location = getText($child);
    } else if (strcasecmp($child->nodeName, ELEMENT_TAG) == 0) {
      $info->tag = getText($child);
    } else {
      // TODO error
    }
  }
  return $info;
}

/*
 * Return the text from the given node, if any.
 */
function getText($node) {
  foreach ($node->childNodes as $child) {
    if ($child->nodeType != XML_TEXT_NODE) continue;
    return $child->wholeText;
  }
}

/*
 * Create and return a Contact object from the given DOM node.
 */
function createContact($node) {
  $contact = new contact();
  foreach ($node->childNodes as $child) {
    if ($child->nodeType != XML_ELEMENT_NODE) continue;
    if (strcasecmp($child->nodeName, ELEMENT_NAME) == 0) {
      $contact->name = getText($child);
    } else if (strcasecmp($child->nodeName, ELEMENT_EMAIL) == 0) {
      $contact->email = getText($child);
    } else if (strcasecmp($child->nodeName, ELEMENT_COMPANY) == 0) {
      $contact->company = getText($child);
    } else  {
      // TODO error
    }
  }
  return $contact;
}

/*
 * Return an array of strings which represent the notes contained
 * in the given <notes> element.
 */
function createNotes($node) {
  $result = array();
  $children = $node->childNodes;
  foreach ($children as $child) {
    if ($child->nodeType != XML_ELEMENT_NODE) continue;
    if (strcasecmp($child->nodeName, ELEMENT_NOTE) != 0) continue;
    // we have a <note> element so store the text
    foreach ($child->childNodes as $sub) {
      if ($sub->nodeType != XML_TEXT_NODE) continue;
      $result[] = $sub->wholeText;
    }
  }
  return $result;
}

/*
 * Create and return a Legal object based on the given node.
 */
function createLegal($node) {
  $legal = new legal();
  $children = $node->childNodes;
  foreach ($children as $child) {
    if ($child->nodeType != XML_ELEMENT_NODE) continue;
    if (strcasecmp($child->nodeName, ELEMENT_IPZILLA) == 0) {
      $legal->ipzilla = $child->getAttribute(ATTRIBUTE_BUG_ID);
    } else if (strcasecmp($child->nodeName, ELEMENT_LICENSE) == 0) {
      $legal->license = createLicense($child);
    } else if (strcasecmp($child->nodeName, ELEMENT_PACKAGE) == 0) {
      $legal->package = getText($child);
    } else {
      // TODO error
    }
  }
  return $legal;
}

/*
 * Create and return a License object based on the given DOM node.
 */
function createLicense($node) {
  $license = new license();
  $children = $node->childNodes;
  foreach ($children as $child) {
    if ($child->nodeType != XML_ELEMENT_NODE) continue;
    if (strcasecmp($child->nodeName, ELEMENT_NAME) == 0) {
      $license->name = getText($child);
    } else if (strcasecmp($child->nodeName, ELEMENT_REFERENCE) == 0) {
      $license->reference = getText($child);
    } else {
      // TODO error
    }
  }
  return $license;
}

?>