/**
   * Creates the parallel environment element for the given task. Corresponds to <define
   * name="parallel">
   *
   * @return the {@link XMLTags#PARALLEL_ENV} element if the task has a parallel environment, null
   *     otherwise
   */
  private Element createParallelEnvironment(Document doc, Task task) {
    ParallelEnvironment penv = task.getParallelEnvironment();
    if (penv == null) return null;

    Element parallelEnvE =
        doc.createElementNS(Schemas.SCHEMA_LATEST.namespace, XMLTags.PARALLEL_ENV.getXMLName());
    setAttribute(
        parallelEnvE, XMLAttributes.TASK_NB_NODES, Integer.toString(penv.getNodesNumber()));

    // <ref name="topology"/>
    TopologyDescriptor topologyDescr = penv.getTopologyDescriptor();
    if (topologyDescr != null) {

      // <choice>
      // <ref name="arbitrary"/>
      // <ref name="bestProximity"/>
      // <ref name="thresholdProximity"/>
      // <ref name="singleHost"/>
      // <ref name="singleHostExclusive"/>
      // <ref name="multipleHostsExclusive"/>
      // <ref name="differentHostsExclusive"/>
      // </choice>

      Element topologyE =
          doc.createElementNS(Schemas.SCHEMA_LATEST.namespace, XMLTags.TOPOLOGY.getXMLName());
      Element topologyDescrE = null;

      if (topologyDescr instanceof ArbitraryTopologyDescriptor) {
        topologyDescrE =
            doc.createElementNS(
                Schemas.SCHEMA_LATEST.namespace, XMLTags.TOPOLOGY_ARBITRARY.getXMLName());
      } else if (topologyDescr instanceof ThresholdProximityDescriptor) {
        topologyDescrE =
            doc.createElementNS(
                Schemas.SCHEMA_LATEST.namespace, XMLTags.TOPOLOGY_THRESHOLD_PROXIMITY.getXMLName());
        long threshold = ((ThresholdProximityDescriptor) topologyDescr).getThreshold();
        topologyDescrE.setAttribute(
            XMLAttributes.TOPOLOGY_THRESHOLD.getXMLName(), Long.toString(threshold));
      } else if (topologyDescr instanceof BestProximityDescriptor) {
        topologyDescrE =
            doc.createElementNS(
                Schemas.SCHEMA_LATEST.namespace, XMLTags.TOPOLOGY_BEST_PROXIMITY.getXMLName());

      } else if (topologyDescr instanceof SingleHostExclusiveDescriptor) {
        topologyDescrE =
            doc.createElementNS(
                Schemas.SCHEMA_LATEST.namespace,
                XMLTags.TOPOLOGY_SINGLE_HOST_EXCLUSIVE.getXMLName());
      } else if (topologyDescr instanceof SingleHostDescriptor) {
        topologyDescrE =
            doc.createElementNS(
                Schemas.SCHEMA_LATEST.namespace, XMLTags.TOPOLOGY_SINGLE_HOST.getXMLName());
      } else if (topologyDescr instanceof MultipleHostsExclusiveDescriptor) {
        topologyDescrE =
            doc.createElementNS(
                Schemas.SCHEMA_LATEST.namespace,
                XMLTags.TOPOLOGY_MULTIPLE_HOSTS_EXCLUSIVE.getXMLName());
      }
      if (topologyDescr instanceof DifferentHostsExclusiveDescriptor) {
        topologyDescrE =
            doc.createElementNS(
                Schemas.SCHEMA_LATEST.namespace,
                XMLTags.TOPOLOGY_DIFFERENT_HOSTS_EXCLUSIVE.getXMLName());
      }

      if (topologyDescrE != null) {
        topologyE.appendChild(topologyDescrE);
      }

      parallelEnvE.appendChild(topologyE);
    }
    return parallelEnvE;
  }